检查XML是否有两种不同类型的元素节点——如何使用XSLT将其引入输出XML



我已经有了一个输入XML

<tutorial>
<lessons>
<lesson>
     chapter1 unit 1 page1
</lesson>
<lesson>
     unit 1 
</lesson>
</lessons>
</tutorial>

输出应为

<Geography>
<historical>
    <social>
       <toc1>
     <toc>
      <chapter>
    chapter1
      <chapter>
      <unit>
    unit 1
      </unit>
      <pages>
    page1
      </pages>
      </toc>
       </toc1>
    <social>
</historical>

实际上我在这里很困惑

 <lesson>
chapter1 unit 1 page1
</lesson>
<lesson>
 unit 1 
</lesson>

这里我需要两个输出

对于第一课,我需要它作为上面的输出

对于第二节课,我需要它作为下面的输出

 <historical>
    <social>
       <toc1>
  <toc>
      <unit>
    unit 1
      </unit>   
  <toc>
       </toc1>
    <social>
</historical>

但有时我会在xml中同时输入两种类型,我完全不知道如何做到这一点。

有人能在这里指导我吗?它可以是XSLT1.0和XSLT2.0

问候Karthic

此XSLT 2.0转换

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>
  <xsl:variable name="vNames" select="'chapter', 'unit', 'pages'"/>
 <xsl:template match="lessons">
    <Geography>
      <historical>
        <social>
           <toc1>
             <xsl:apply-templates/>
           </toc1>
        </social>
      </historical>
    </Geography>
 </xsl:template>
 <xsl:template match="lesson[matches(., '(chapters*d+)?s+(units*d+)s+(pages*d+)?')]">
  <xsl:analyze-string select="."
   regex="(chapters*d+)?s+(units*d+)s+(pages*d+)?">
    <xsl:matching-substring>
      <toc>
         <xsl:for-each select="1 to 3">
          <xsl:if test="regex-group(current())">
           <xsl:element name="{$vNames[current()]}">
                <xsl:sequence select="regex-group(current())"/>
           </xsl:element>
          </xsl:if>
         </xsl:for-each>
      </toc>
    </xsl:matching-substring>
  </xsl:analyze-string>
 </xsl:template>
</xsl:stylesheet>

应用于所提供的XML文档时:

<tutorial>
    <lessons>
    <lesson>
         chapter1 unit 1 page1
    </lesson>
    <lesson>
         unit 1
    </lesson>
    </lessons>
</tutorial>

生成所需的正确结果:

<Geography>
  <historical>
    <social>
      <toc1>
        <toc>
          <chapter>chapter1</chapter>
          <unit>unit 1</unit>
          <pages>page1</pages>
        </toc>
        <toc>
          <unit>unit 1</unit>
        </toc>
      </toc1>
    </social>
  </historical>
</Geography>

解释

正确使用XSLT2.0正则表达式功能,例如:

  1. <xsl:analyze-string><xsl:matching-substring>指令。

  2. regex-group()函数。

相关内容

  • 没有找到相关文章

最新更新