颠倒孩子的顺序

发布于 2024-11-04 00:33:43 字数 2794 浏览 1 评论 0原文

我想使用模板来反转 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>&#10;</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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

最美的太阳 2024-11-11 00:33:43

这是一个更简单的 XSLT 1.0(和 2.0)解决方案

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="*[section]">
  <xsl:copy>
   <xsl:copy-of select="@*"/>
   <xsl:apply-templates>
     <xsl:sort select="position()"
      data-type="number" order="descending"/>
   </xsl:apply-templates>
  </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

当此转换应用于以下 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>

想要的正确结果(<的所有序列) code>section 元素反转)生成

<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>

Here is a simpler XSLT 1.0 (and 2.0) solution:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
  <xsl:copy>
   <xsl:apply-templates select="node()|@*"/>
  </xsl:copy>
 </xsl:template>

 <xsl:template match="*[section]">
  <xsl:copy>
   <xsl:copy-of select="@*"/>
   <xsl:apply-templates>
     <xsl:sort select="position()"
      data-type="number" order="descending"/>
   </xsl:apply-templates>
  </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

when this transformation is applied on the following XML document:

<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>

the wanted, correct result (all sequences of section elements reversed) is produced :

<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>
小瓶盖 2024-11-11 00:33:43

此 XSLT 2.0 样式表:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:strip-space elements="*"/>
    <xsl:template match="node()|@*" name="identity">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="chapter|section">
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <xsl:apply-templates>
                <xsl:sort select="tokenize(@title,'.')[last()]"
                          order="descending"
                          data-type="number"/>
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

输出:

<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>

This XSLT 2.0 stylesheet:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:strip-space elements="*"/>
    <xsl:template match="node()|@*" name="identity">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="chapter|section">
        <xsl:copy>
            <xsl:apply-templates select="@*"/>
            <xsl:apply-templates>
                <xsl:sort select="tokenize(@title,'.')[last()]"
                          order="descending"
                          data-type="number"/>
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

Output:

<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>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文