我想知道是否可以使用XSLT对XML文件进行排序,即使我不知道整个XML模式。
例如,我想对以下XML文件进行排序。
按/CATALOG/CD/TITLE对/CATALOG/CD元素进行排序
输出结果应该是:
以下是我尝试过的其中一种方法:
问题在于,使用这个XSLT时,CD列表外的XML部分不会显示。
我可以取消注释代码的两个部分,但这正是我想避免的。
在这种情况下,如果将任何属性添加到CATALOG元素中,则不会将它们复制到输出XML中。
我不想重新构建XML文件:我只想进行排序,仅知道一些XML模式的确切信息。
例如,使用.NET(使用XmlDocument和XmlNode对象)或Python的lxmx库很容易实现此功能,但是使用XSLT是否可能?
谢谢!
注意:很难找到一个样本输入XML,以避免在所有情况下误解问题。但我会尽力详细说明问题:
- 仅应对CATALOG下面的CD元素进行排序(例如,在Bob Dylan部分下的CD元素应保持不变) - 无论除CD以外的元素(例如DVD和DVD2)是在列表的开头还是结尾都是一样的 - 输出XML中不应缺少任何元素、属性、值、注释等内容 - 非CD元素(例如DVD和DVD2)不应按TITLE子元素排序
例如,我想对以下XML文件进行排序。
按/CATALOG/CD/TITLE对/CATALOG/CD元素进行排序
<CATALOG attrib1="value1">
<DVD2>
<TITLE>The Godfather2</TITLE>
</DVD2>
<CD>
<TITLE>Hide your heart</TITLE>
<ARTIST>Bonnie Tyler</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>CBS Records</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1988</YEAR>
</CD>
<CD attrib4="value4">
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>
<CATALOG>
<CD><TITLE>E</TITLE></CD>
<CD><TITLE>I</TITLE></CD>
<CD><TITLE>D</TITLE></CD>
</CATALOG>
</PRICE>
<YEAR>1985</YEAR>
</CD>
<CD attrib2="value2">
<TITLE attrib3="value3">Greatest Hits</TITLE>
<ARTIST>Dolly Parton</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>RCA</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1982</YEAR>
</CD>
<DVD>
<TITLE>The Godfather1</TITLE>
</DVD>
</CATALOG>
输出结果应该是:
<CATALOG attrib1="value1">
<CD attrib4="value4">
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>
<CATALOG>
<CD><TITLE>E</TITLE></CD>
<CD><TITLE>I</TITLE></CD>
<CD><TITLE>D</TITLE></CD>
</CATALOG>
</PRICE>
<YEAR>1985</YEAR>
</CD>
<CD attrib2="value2">
<TITLE attrib3="value3">Greatest Hits</TITLE>
<ARTIST>Dolly Parton</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>RCA</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1982</YEAR>
</CD>
<CD>
<TITLE>Hide your heart</TITLE>
<ARTIST>Bonnie Tyler</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>CBS Records</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1988</YEAR>
</CD>
<DVD2>
<TITLE>The Godfather2</TITLE>
</DVD2>
<DVD>
<TITLE>The Godfather1</TITLE>
</DVD>
</CATALOG>
以下是我尝试过的其中一种方法:
下面是我所做的众多尝试之一:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<!--<CATALOG>-->
<xsl:for-each select="CATALOG/CD">
<xsl:sort select="TITLE" />
<xsl:copy-of select="."/>
</xsl:for-each>
<!--</CATALOG>-->
</xsl:template>
</xsl:stylesheet>
问题在于,使用这个XSLT时,CD列表外的XML部分不会显示。
我可以取消注释代码的两个部分,但这正是我想避免的。
在这种情况下,如果将任何属性添加到CATALOG元素中,则不会将它们复制到输出XML中。
我不想重新构建XML文件:我只想进行排序,仅知道一些XML模式的确切信息。
例如,使用.NET(使用XmlDocument和XmlNode对象)或Python的lxmx库很容易实现此功能,但是使用XSLT是否可能?
谢谢!
注意:很难找到一个样本输入XML,以避免在所有情况下误解问题。但我会尽力详细说明问题:
- 仅应对CATALOG下面的CD元素进行排序(例如,在Bob Dylan部分下的CD元素应保持不变) - 无论除CD以外的元素(例如DVD和DVD2)是在列表的开头还是结尾都是一样的 - 输出XML中不应缺少任何元素、属性、值、注释等内容 - 非CD元素(例如DVD和DVD2)不应按TITLE子元素排序