使用xslt反转XML中的内容

时间:2014-12-24 15:24:35

标签: xml xslt

我正在学习考试,我们应该能够在XML中扭转事物。我试图扭转书籍的顺序,或者颠倒那些书中元素的顺序。

输入XML是:

   <library>
    <book>
      <author>James Joyce</author> 
      <title>Ulysses</title>
      <year>1922</year>
    </book>
    <book>
      <author>Alois Jirasek</author> 
      <title>Psohlavci</title>
      <year>1910</year>
    </book>
    <book>
      <author>Tomas Hruska</author> 
      <title>Pascal pro zacatecniky</title>
      <year>1989</year>
    </book>
  </library>

书籍的反转顺序:

   <library>
    <book>
      <author>Tomas Hruska</author> 
      <title>Pascal pro zacatecniky</title>
      <year>1989</year>
    </book>
    <book>
      <author>Alois Jirasek</author> 
      <title>Psohlavci</title>
      <year>1910</year>
    </book>
    <book>
      <author>James Joyce</author> 
      <title>Ulysses</title>
      <year>1922</year>
    </book>
  </library>

书中物品的逆转顺序:

   <library>
    <book>
      <year>1922</year>
      <title>Ulysses</title>
      <author>James Joyce</author>
    </book>
    <book>
      <year>1910</year>
      <title>Psohlavci</title>
      <author>Alois Jirasek</author> 
    </book>
    <book>
      <year>1989</year>
      <title>Pascal pro zacatecniky</title>
      <author>Tomas Hruska</author> 
    </book>
  </library>

我被告知它应该很容易,所以不要尝试任何太花哨的东西。我可以通过for-each使用基本循环,也可以通过apply-templates和value-of使用递归。

3 个答案:

答案 0 :(得分:1)

试试这个:

首先输入排序:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
    <xsl:template match="@*|node()">
        <xsl:copy>
          <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

<xsl:template match="library">
    <library>
    <xsl:for-each select="book">
    <xsl:sort select="position()" order="descending"/>
        <xsl:copy><xsl:apply-templates select="node()|@*"/></xsl:copy>
    </xsl:for-each>
    </library>
</xsl:template>

</xsl:stylesheet>

第二种类型:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
    <xsl:template match="@*|node()">
        <xsl:copy>
          <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

<xsl:template match="book">
    <book>
    <xsl:for-each select="*">
    <xsl:sort select="position()" order="descending"/>
        <xsl:copy><xsl:apply-templates select="node()|@*"/></xsl:copy>
    </xsl:for-each>
    </book>
</xsl:template>

</xsl:stylesheet>

答案 1 :(得分:0)

最简单的方法是按位置()降序 sort 节点。

答案 2 :(得分:0)

非常简单:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/library">
        <library>
            <xsl:for-each select="book">
                <xsl:sort select="author" order="descending"/>
                <xsl:copy-of select="."/>
            </xsl:for-each>
        </library>
    </xsl:template>
</xsl:stylesheet>