我正在尝试按<title>
对以下xml文件进行排序。我没有使用xml或xsl的经验。我想以相同的xml格式输出一个文件但已排序。我已经包含了迄今为止的xsl。
非常感谢任何建议或指示我如何实现这一目标。
谢谢你的帮助
大卫
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="j2014-sort.xsl"?>
<channel>
<item>
<title>_zigfried j Myers (25000, )</title>
<link>http://masortiolami.org/_zigfried-j-myers-25000/</link>
</item>
<item>
<title>_Joe Blogs (500, )</title>
<link>http://masortiolami.org/_joe-blogs-500/</link>
</item>
<item>
<title>_Minni Mouse (0, 641)</title>
<link>http://masortiolami.org/_minni-mouse-0-641/</link>
</item>
<item>
<title>_Sitting Bull (10000, )</title>
<link>http://masortiolami.org/_sitting-bull-10000/</link>
</item>
</channel>
这是xsl:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:result-document href="j2014-new.xml" method="xml">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:result-document>
<xsl:apply-templates>
<xsl:sort select="title"/>
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>
当我在浏览器中运行此xsl时,它不会产生任何输出。只是一个代码列表。
答案 0 :(得分:0)
要按标题对列表进行排序,您必须稍微调整一下XSLT。用于测试目的 在线XSLT处理器我调整如下:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/*">
<channel>
<xsl:apply-templates select="item">
<xsl:sort select="title"/>
</xsl:apply-templates>
</channel>
</xsl:template>
<xsl:template match="item">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
结果:
<?xml version="1.0" encoding="UTF-8"?>
<channel>
<item>
<title>_Joe Blogs (500, )</title>
<link>http://masortiolami.org/_joe-blogs-500/</link>
</item>
<item>
<title>_Minni Mouse (0, 641)</title>
<link>http://masortiolami.org/_minni-mouse-0-641/</link>
</item>
<item>
<title>_Sitting Bull (10000, )</title>
<link>http://masortiolami.org/_sitting-bull-10000/</link>
</item>
<item>
<title>_zigfried j Myers (25000, )</title>
<link>http://masortiolami.org/_zigfried-j-myers-25000/</link>
</item>
</channel>
正如您将注意到的,只需要进行一些调整 - 第一个模板与根节点(match="/*"
)匹配。在此模板中,仅使用xsl:sort
并使用title作为排序键来应用item-elements。匹配item-elements的第二个模板只是使用<xsl:copy-of/>
复制已排序的项目节点
您应该考虑编辑您的问题 - 由于缺少代码格式化,<title>
未显示在您的句子中“我正在尝试按以下方式对以下xml文件进行排序。”刚注意到这在编辑模式中查看问题但由于编辑需要更改至少6个字符而无法更改此问题。您的XML也存在一个小问题 - 它以</channel>
而不是<channel>
开头,所以它无效。
仅使用在线XSLT工具进行上述测试所需的另一项调整是删除xsl:result-document
元素。
由于xsl:result-document-element
仅适用于XSLT 2.0,因此当您读取xsl:result-document
并更改为xsl:stylesheet
- 元素中的XSLT版本2.0时,应该适合您,以防您的XSLT处理器可以处理XSLT 2.0。所以完整的XSLT将是
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/*">
<xsl:result-document href="j2014-new.xml" method="xml">
<channel>
<xsl:apply-templates select="item">
<xsl:sort select="title"/>
</xsl:apply-templates>
</channel>
</xsl:result-document>
</xsl:template>
<xsl:template match="item">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
如果您只能使用XSLT 1.0,请在您的问题中更新此信息,并提供有关如何处理XSLT以及您正在使用哪个XSLT处理器的信息(例如,如果它是Saxon或其他)。根据您的环境/设置,例如,可以调整特定配置中的output-filename。
供参考:http://www.saxonica.com/documentation/xsl-elements/result-document.html和http://www.saxonica.com/documentation/xsl-elements/output.html
答案 1 :(得分:0)
当我在浏览器中运行此xsl时,它不会产生任何输出。
在浏览器中运行XSL转换会不生成新文件。所有浏览器都会在屏幕上显示结果。
另请注意,xsl:result-document
是XSLT 2.0指令。没有支持XSLT 2.0的浏览器。
在任何情况下,如果您希望转换生成新文件,则必须使用其他工具运行 - 例如直接来自命令行。在这种情况下,您可以在启动转换的同时指定生成的文件的名称和路径。