颠倒孩子的顺序
我想使用模板来反转 XML 的不同序列; 例如:
<book title="Definitive XML Schema">
<author first="Priscilla" />
<chapter title="[I] ">
<section title="[I.1]" />
<section title="[I.2]">
<section title="[I.2.1]" />
<section title="[I.2.2]" />
</section>
<section title="[I.3] ">
<section title="[I.3.1]" />
</section>
</chapter>
<chapter title="[II]">
<section title="[II.1]" />
<section title="[II.2]">
<section title="[II.2.1]" />
<section title="[II.2.2]" />
</section>
</chapter>
</book>
我想得到这样的输出:this is my xsl.
<?xml version="1.0" encoding="UTF-8"?>
<book title="Definitive XML Schema">
<author first="Priscilla"/>
<chapter title="[I]">
<section title="[I.3]">
<section title="[I.3.1]"/>
</section>
<section title="[I.2]">
<section title="[I.2.2]"/>
<section title="[I.2.1]"/>
</section>
<section title="[I.1]"/>
</chapter>
<chapter title="[II]">
<section title="[II.2]">
<section title="[II.2.2]"/>
<section title="[II.2.1]"/>
</section>
<section title="[II.1]"/>
</chapter>
</book>
是的,章节已颠倒,但章节没有。
我尝试使用两个模板来解决它,但它不起作用..
<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform 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 method="xml" version="1.0" encoding="UTF-8" indent ="yes"/>
<xsl:template match="/">
<xsl:apply-templates/>
<xsl:text> </xsl:text>
</xsl:template>
<xsl:template match="book">
<xsl:copy>
<xsl:sequence select="@title"/>
<xsl:sequence select="author"/>
<xsl:apply-templates select="chapter">
<xsl:with-param name="seq" select="section"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match ="chapter|section" as="element()">
<xsl:param name="seq" as="element(section)*"/>
<xsl:copy>
<xsl:sequence select="@title"/>
<xsl:if test="not(empty($seq))">
<xsl:apply-templates select="chapter">
<xsl:with-param name="seq" select="$seq[position()>1]"/>
</xsl:apply-templates>
<xsl:apply-templates select="$seq[1]"/>
</xsl:if>
</xsl:copy>
</xsl:template>
</xsl:transform>
I want to use templates to reverse the different sequences of XML;
For example :
<book title="Definitive XML Schema">
<author first="Priscilla" />
<chapter title="[I] ">
<section title="[I.1]" />
<section title="[I.2]">
<section title="[I.2.1]" />
<section title="[I.2.2]" />
</section>
<section title="[I.3] ">
<section title="[I.3.1]" />
</section>
</chapter>
<chapter title="[II]">
<section title="[II.1]" />
<section title="[II.2]">
<section title="[II.2.1]" />
<section title="[II.2.2]" />
</section>
</chapter>
</book>
I want to get the output like this:this is my xsl.
<?xml version="1.0" encoding="UTF-8"?>
<book title="Definitive XML Schema">
<author first="Priscilla"/>
<chapter title="[I]">
<section title="[I.3]">
<section title="[I.3.1]"/>
</section>
<section title="[I.2]">
<section title="[I.2.2]"/>
<section title="[I.2.1]"/>
</section>
<section title="[I.1]"/>
</chapter>
<chapter title="[II]">
<section title="[II.2]">
<section title="[II.2.2]"/>
<section title="[II.2.1]"/>
</section>
<section title="[II.1]"/>
</chapter>
</book>
Yes,the sections have been reversed but the chapters are not.
I try to use two templates to solve it,but it can not work..
<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform 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 method="xml" version="1.0" encoding="UTF-8" indent ="yes"/>
<xsl:template match="/">
<xsl:apply-templates/>
<xsl:text>
</xsl:text>
</xsl:template>
<xsl:template match="book">
<xsl:copy>
<xsl:sequence select="@title"/>
<xsl:sequence select="author"/>
<xsl:apply-templates select="chapter">
<xsl:with-param name="seq" select="section"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match ="chapter|section" as="element()">
<xsl:param name="seq" as="element(section)*"/>
<xsl:copy>
<xsl:sequence select="@title"/>
<xsl:if test="not(empty($seq))">
<xsl:apply-templates select="chapter">
<xsl:with-param name="seq" select="$seq[position()>1]"/>
</xsl:apply-templates>
<xsl:apply-templates select="$seq[1]"/>
</xsl:if>
</xsl:copy>
</xsl:template>
</xsl:transform>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这是一个更简单的 XSLT 1.0(和 2.0)解决方案:
当此转换应用于以下 XML 文档时:
想要的正确结果(<的所有序列) code>section 元素反转)生成 :
Here is a simpler XSLT 1.0 (and 2.0) solution:
when this transformation is applied on the following XML document:
the wanted, correct result (all sequences of
section
elements reversed) is produced :此 XSLT 2.0 样式表:
输出:
This XSLT 2.0 stylesheet:
Output: