我已经有了一个输入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正则表达式功能,例如:
<xsl:analyze-string>
和<xsl:matching-substring>
指令。regex-group()
函数。