排序xml文件 - 如何指定输出

时间:2014-09-25 23:01:24

标签: xml xslt

我正在尝试按<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时,它不会产生任何输出。只是一个代码列表。

2 个答案:

答案 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.htmlhttp://www.saxonica.com/documentation/xsl-elements/output.html

答案 1 :(得分:0)

  

当我在浏览器中运行此xsl时,它不会产生任何输出。

在浏览器中运行XSL转换会生成新文件。所有浏览器都会在屏幕上显示结果。

另请注意,xsl:result-document是XSLT 2.0指令。没有支持XSLT 2.0的浏览器。

在任何情况下,如果您希望转换生成新文件,则必须使用其他工具运行 - 例如直接来自命令行。在这种情况下,您可以在启动转换的同时指定生成的文件的名称和路径。