1

与上一篇文章。

链接在这里

上一个问题

再次在输入 xml 中进行小更新,其他验证都相同。这里只有章节(元素)在变化,而不是章节我会有数字

<tutorial>
<lessons>
    <lesson>
     12000 Bat 20 
    </lesson>
    <lesson>
        15000 Pen Ball 10~ 
    </lesson>
    <lesson>
        14000 Book 
    </lesson>
    <lesson>
        note lesson
    </lesson>
</lessons>
<lessons1>
    <lesson>
        24000 Pencil 10
    </lesson>
    <lesson>
        description page
    </lesson>
    <lesson>
        8000 Car Tank 25
    </lesson>
</lessons1>

在上一个问题中,我们有第一个节点(第 20 章),但这里我有 12000 蝙蝠 20

上述输入的期望输出是

<Geography>
<historical>
  <social>
     <toc1>
        <toc>
           <chapter>12000</chapter>
           <unit>Bat</unit>
           <pages>20</pages>
        </toc>
        <toc>
           <chapter>15000</chapter>
           <unit>Pen Ball</unit>
           <pages>10</pages>
        </toc>
        <toc>
           <chapter>14000</chapter>
           <unit>Book</unit>
           <pages>10</pages>
        </toc>
        <toc>
           <sample>
              <original>note lesson</original>
           </sample>
        </toc>
     </toc1>
     <toc2>
        <toc>
           <chapter>24000</chapter>
           <unit>Pencil</unit>
           <pages>10</pages>
        </toc>
        <toc>
           <sample>
              <original>description page</original>
           </sample>
        </toc>
        <toc>
           <chapter>8000</chapter>
           <unit>Car Tank</unit>
           <pages>25</pages>
        </toc>
     </toc2>
  </social>

@Dimitre & @Tomalak 从下一次开始,我会写出完全准备好的问题,我肯定会用我所拥有的解决方案发布它,现在我开始用下面的输出和以前的输出更快地学习(XSLT)。

请在这里指导我

在此先感谢 Karthic

4

1 回答 1

1

这种转变

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
              xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs">
                <xsl:output omit-xml-declaration="yes" indent="yes"/>
                <xsl:strip-space elements="*"/>

             <xsl:template match="tutorial">
                <Geography>
                  <historical>
                    <social>
                         <xsl:apply-templates select=
                         "*[starts-with(name(),'lessons')]"/>
                    </social>
                  </historical>
                </Geography>
             </xsl:template>

             <xsl:template match="*[starts-with(name(), 'lessons')]">
              <xsl:variable name="vPos" select="position()"/>

              <xsl:element name="toc{$vPos}">
               <xsl:apply-templates/>
              </xsl:element>

             </xsl:template>

             <xsl:template match=
             "lesson[substring-before(normalize-space(), ' ')
                    castable as xs:integer
                    ]">
              <xsl:variable name="vNorm" select=
                             "translate(normalize-space(), '~', '')"/>
              <xsl:variable name="vAtUnit" select=
                             "substring-after($vNorm, ' ')"/>

              <xsl:variable name="vUnit" select=
              "replace($vAtUnit, '([^0123456789]+)(\d*)', '$1')"/>

              <xsl:variable name="vLastPart" as="xs:string" select=
               "substring-after($vAtUnit, $vUnit)"/>

              <xsl:variable name="vNum"
                select="concat($vLastPart, '10'[not($vLastPart)])"/>

              <toc>
                <chapter>
                 <xsl:value-of select="substring-before($vNorm, ' ')"/>
                </chapter>
                <unit><xsl:value-of select="normalize-space($vUnit)"/></unit>
                <pages><xsl:value-of select="$vNum"/></pages>
              </toc>
             </xsl:template>

             <xsl:template match="lesson">
               <toc>
                   <sample>
                     <original><xsl:value-of select="normalize-space()"/></original>
                   </sample>
               </toc>
             </xsl:template>
</xsl:stylesheet>

应用于提供的 XML 文档时

    <tutorial>
    <lessons>
        <lesson>
         12000 Bat 20
        </lesson>
        <lesson>
            15000 Pen Ball 10~
        </lesson>
        <lesson>
            14000 Book
        </lesson>
        <lesson>
            note lesson
        </lesson>
    </lessons>
    <lessons1>
        <lesson>
            24000 Pencil 10
        </lesson>
        <lesson>
            description page
        </lesson>
        <lesson>
            8000 Car Tank 25
        </lesson>
    </lessons1>
</tutorial>

产生想要的正确结果

<Geography>
   <historical>
      <social>
         <toc1>
            <toc>
               <chapter>12000</chapter>
               <unit>Bat</unit>
               <pages>20</pages>
            </toc>
            <toc>
               <chapter>15000</chapter>
               <unit>Pen Ball</unit>
               <pages>10</pages>
            </toc>
            <toc>
               <chapter>14000</chapter>
               <unit>Book</unit>
               <pages>10</pages>
            </toc>
            <toc>
               <sample>
                  <original>note lesson</original>
               </sample>
            </toc>
         </toc1>
         <toc2>
            <toc>
               <chapter>24000</chapter>
               <unit>Pencil</unit>
               <pages>10</pages>
            </toc>
            <toc>
               <sample>
                  <original>description page</original>
               </sample>
            </toc>
            <toc>
               <chapter>8000</chapter>
               <unit>Car Tank</unit>
               <pages>25</pages>
            </toc>
         </toc2>
      </social>
   </historical>
</Geography>
于 2012-07-19T03:38:39.293 回答