检查XML是否有两种不同类型的元素节点如何使用XSLT将其引入输出XML
我已经有了一个输入XML检查XML是否有两种不同类型的元素节点如何使用XSLT将其引入输出XML,xml,xslt,xslt-1.0,xslt-2.0,Xml,Xslt,Xslt 1.0,Xslt 2.0,我已经有了一个输入XML <tutorial> <lessons> <lesson> chapter1 unit 1 page1 </lesson> <lesson> unit 1 </lesson> </lessons> </tutorial> 第1章第1单元第1页 第一单元 输出应该是 <Geography> <historical> &
<tutorial>
<lessons>
<lesson>
chapter1 unit 1 page1
</lesson>
<lesson>
unit 1
</lesson>
</lessons>
</tutorial>
第1章第1单元第1页
第一单元
输出应该是
<Geography>
<historical>
<social>
<toc1>
<toc>
<chapter>
chapter1
<chapter>
<unit>
unit 1
</unit>
<pages>
page1
</pages>
</toc>
</toc1>
<social>
</historical>
第1章
第一单元
第1页
事实上,我在这里感到困惑
<lesson>
chapter1 unit 1 page1
</lesson>
<lesson>
unit 1
</lesson>
第1章第1单元第1页
第一单元
这里我需要两辆车
对于第一课,我需要如上所述的输出
对于第二节课,我需要它作为输出,如下所示
<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(., '(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>
第1章第1单元第1页
第一单元
生成所需的正确结果:
<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>
第1章
第一单元
第1页
第一单元
说明:
<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>
正确使用XSLT 2.0正则表达式功能,例如:
你是对的:你很困惑。你的读者同样会感到困惑。除非您能清楚地表达需求,否则我们无法帮助您编写代码。有时,提供一个输入和一个输出文档就足以让人们制定转换规则;这里不是这样。我们需要更彻底地解释可能存在的输入以及如何处理每个可能的输入。嗨@Dimitre我已经离开车站了,回来后我会检查谢谢you@karthic:没问题,方便的时候一定要看一下答案。嗨@Dimitre我还有一个问题,我可以修改这个问题吗?或者我可以创建一个新问题吗?请指导我。@karthic:最好不要随时间推移发问——请问一个新问题。我很乐意回答你们接下来的问题。这个答案完全解决了你当前问题中所定义的问题——请考虑接受它。谢谢。