]> Lady’s Gitweb - Shushe/blobdiff - parsers/tsv.xslt
Don’t use literal result elements in transforms
[Shushe] / parsers / tsv.xslt
index 4de3b9853401f6b838ac84afb2bdf2fe121ac0c5..90e156e28c776c3b51bf74b557c1e35a687e5396 100644 (file)
@@ -1,45 +1,95 @@
 <?xml version="1.0"?>
 <!--
-⁌ ⛩️📰 书社 ∷ parsers/tsv.xslt
+SPDX-FileCopyrightText: 2023, 2024 Lady <https://www.ladys.computer/about/#lady>
+SPDX-License-Identifier: MPL-2.0
+-->
+<!--
+⁌ ⛩📰 书社 ∷ parsers/tsv.xslt
 
-© 2023 Lady [@ Lady’s Computer]
+© 2023–2024 Lady [@ Ladys Computer].
 
 This Source Code Form is subject to the terms of the Mozilla Public License, v 2.0.
 If a copy of the M·P·L was not distributed with this file, You can obtain one at <https://mozilla.org/MPL/2.0/>.
 -->
+<!DOCTYPE transform [
+       <!ENTITY xhtml 'http://www.w3.org/1999/xhtml'>
+]>
 <transform
        xmlns="http://www.w3.org/1999/XSL/Transform"
        xmlns:exsl="http://exslt.org/common"
        xmlns:exslstr="http://exslt.org/strings"
-       xmlns:html="http://www.w3.org/1999/xhtml"
-       exclude-result-prefixes="exsl exslstr"
+       xmlns:html="&xhtml;"
+       xmlns:书社="urn:fdc:ladys.computer:20231231:Shu1She4"
+       extension-element-prefixes="exsl exslstr"
        version="1.0"
 >
+       <import href="../lib/split.xslt"/>
+       <书社:id>urn:fdc:ladys.computer:20231231:Shu1She4:tsv.xslt</书社:id>
        <template match="html:script[@type='text/tab-separated-values']">
-               <variable name="rows" select="exslstr:tokenize(., '&#xA;')[normalize-space(.) and not(starts-with(., '#'))]"/>
-               <variable name="head" select="exsl:node-set($rows)[1]"/>
-               <variable name="body" select="exsl:node-set($rows)[not(position()=1)]"/>
-               <html:table>
-                       <html:thead>
-                               <html:tr>
-                                       <for-each select="exslstr:tokenize($head, '&#x9;')">
-                                               <html:th scope="row">
+               <variable name="lines" select="exslstr:tokenize(., '&#xA;')"/>
+               <variable name="head" select="$lines[normalize-space(.)!='' and not(starts-with(., '#'))][1]"/>
+               <variable name="headcols">
+                       <call-template name="书社:split">
+                               <with-param name="source" select="string($head)"/>
+                               <with-param name="separator" select="'&#x9;'"/>
+                       </call-template>
+               </variable>
+               <element name="table" namespace="&xhtml;">
+                       <for-each select="$lines[starts-with(., '#') and following-sibling::*[generate-id(.)=generate-id($head)]]">
+                               <comment>
+                                       <value-of select="substring-after(., '#')"/>
+                               </comment>
+                       </for-each>
+                       <element name="thead" namespace="&xhtml;">
+                               <element name="tr" namespace="&xhtml;">
+                                       <for-each select="exsl:node-set($headcols)/*">
+                                               <element name="th" namespace="&xhtml;">
+                                                       <attribute name="scope">
+                                                               <text>col</text>
+                                                       </attribute>
                                                        <value-of select="."/>
-                                               </html:th>
+                                               </element>
                                        </for-each>
-                               </html:tr>
-                       </html:thead>
-                       <html:tbody>
-                               <for-each select="exsl:node-set($body)">
-                                       <html:tr>
-                                               <for-each select="exslstr:tokenize(., '&#x9;')">
-                                                       <html:td>
-                                                               <value-of select="."/>
-                                                       </html:td>
-                                               </for-each>
-                                       </html:tr>
+                               </element>
+                       </element>
+                       <element name="tbody" namespace="&xhtml;">
+                               <for-each select="$head/following-sibling::*[normalize-space(.)!='']">
+                                       <choose>
+                                               <when test="starts-with(., '#')">
+                                                       <comment>
+                                                               <value-of select="substring-after(., '#')"/>
+                                                       </comment>
+                                               </when>
+                                               <otherwise>
+                                                       <variable name="cols">
+                                                               <call-template name="书社:split">
+                                                                       <with-param name="source" select="string(.)"/>
+                                                                       <with-param name="separator" select="'&#x9;'"/>
+                                                               </call-template>
+                                                       </variable>
+                                                       <element name="tr" namespace="&xhtml;">
+                                                               <for-each select="exsl:node-set($cols)/*[count(exsl:node-set($headcols)/*)>=position()]">
+                                                                       <element name="td" namespace="&xhtml;">
+                                                                               <attribute name="data-tsv-header">
+                                                                                       <value-of select="exsl:node-set($headcols)/*[count(current()/preceding-sibling::*)+1]"/>
+                                                                               </attribute>
+                                                                               <value-of select="."/>
+                                                                               <if test="position()=count(exsl:node-set($headcols)/*)">
+                                                                                       <for-each select="following-sibling::*">
+                                                                                               <text>&#x9;</text>
+                                                                                               <value-of select="."/>
+                                                                                       </for-each>
+                                                                               </if>
+                                                                       </element>
+                                                               </for-each>
+                                                               <for-each select="exsl:node-set($headcols)/*[position()>count(exsl:node-set($cols)/*)]">
+                                                                       <element name="td" namespace="&xhtml;"/>
+                                                               </for-each>
+                                                       </element>
+                                               </otherwise>
+                                       </choose>
                                </for-each>
-                       </html:tbody>
-               </html:table>
+                       </element>
+               </element>
        </template>
 </transform>
This page took 0.089679 seconds and 4 git commands to generate.