0

我已经有一个输入 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 中

问候卡西克

4

1 回答 1

1

这个 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(., '(chapter\s*\d+)?\s+(unit\s*\d+)\s+(page\s*\d+)?')]">
  <xsl:analyze-string select="."
   regex="(chapter\s*\d+)?\s+(unit\s*\d+)\s+(page\s*\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>

说明

正确使用 XSLT 2.0 正则表达式功能,例如:

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

  2. regex-group()功能。

于 2012-07-13T13:25:28.440 回答