【发布时间】:2011-10-01 02:15:53
【问题描述】:
如果我不知道整个 XML 模式,我想知道 XSLT 是否可以对 XML 文件进行排序。
例如,我想对以下 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)是在列表的开头还是结尾都是一样的
- 没有元素、属性、值、cmets,因此输出 XML 中不应缺少任何内容
- 非 CD 元素(例如 DVD 和 DVD2)不应按 TITLE 子元素排序
【问题讨论】:
-
对不起。由于措辞较弱,不清楚我只想对 CD 元素进行排序。所以我不得不稍微修改一下这个问题。