将XSLT和XML输出转换为XML文件

时间:2015-04-29 10:04:23

标签: xml xslt

我在使用XSLT时遇到了一些问题。

我有这个XML文件:

<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="XSLTest.xsl"?>
<pages>
  <page>
      <title>New Title</title>
      <id>4782</id>
      <timestamp>2012-09-13 13:15:33</timestamp>
      <contributor>
        <username>kf</username>
        <id>2</id>
      </contributor>
      <text xml:space="preserve"> 
      some text
    </text>
 </page>
 </pages>

和这个XSL文件:

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

<xsl:template match="/">
<xsl:for-each select="pages/page">
    <content>
       <id><xsl:value-of select="id"/></id>
       <title><xsl:value-of select="title"/></title>
       <created><xsl:value-of select="timestamp"/></created>
       <created_by><xsl:value-of select="contributor/username"/></created_by>
   </content>
   </xsl:for-each>
   </xsl:template>

现在我的问题:

  1. XML文件转换只能部分工作。除了标题,我得到了我想要的所有值。

  2. 我想将转换后的代码保存到新的XML文件中。

  3. 迭代是必要的,因为我想要更改的原始文件要大得多<pages>

2 个答案:

答案 0 :(得分:1)

  

XML文件转换只能部分工作。除了标题,我得到了我想要的所有值。 (...)我不知道为什么它不能在w3的webeditor上工作

永远不要相信w3schools上的任何内容 - 它们与W3C没有任何关系,并且不能期望它们的工具符合规范。我强烈建议您再也不要使用该站点来测试XSLT转换。在撰写本文时,http://xsltransform.net是一个很好的选择,可以依赖。

  

我想将转换后的代码保存到新的XML文件中。

查看XML文档中的样式表引用:

<?xml-stylesheet type="text/xsl" href="XSLTest.xsl"?>

您似乎正在浏览器中进行此转换。所有主流浏览器都包含XSLT 1.0处理器,但它们不允许您将转换结果保存为文件。在浏览器中,转换旨在促进数据的显示,而不是对文档进行永久性更改。

要将输出保存到文件,您需要

  • 使用Saxon等命令行工具
  • 使用XSLT库和您选择的编程语言来解析输入文件,转换它并将结果输出到文件

关于XSLT版本的最后评论:

您的样式表表明代码应该使用XSLT 2.0版:

<xsl:stylesheet version="2.0">

但目前没有浏览器支持XSLT 2.0。要使用特定于XSLT 2.0的功能(您不使用任何功能),您需要一个XSLT 2.0处理器。

答案 1 :(得分:0)

我遇到了类似的问题,并且发现可以使用Google Chrome浏览器来应用xslt转换。我将在这里记录该过程,因为我已经忘记了如何做。

这是一个示例xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="sort.xslt"?>

<employees>

  <employee hireDate="04/23/1999">
    <last>Hill</last>
    <first>Phil</first>
    <salary>100000</salary>
  </employee>

  <employee hireDate="09/01/1998">
    <last>Herbert</last>
    <first>Johnny</first>
    <salary>95000</salary>
  </employee>

  <employee hireDate="08/20/2000">
    <last>Hill</last>
    <first>Graham</first>
    <salary>89000</salary>
  </employee>

  <employee hireDate="08/20/2001">
    <last>Hill</last>
    <first>Albert</first>
    <salary>110000</salary>
  </employee>

</employees>

这是对应的xslt(sort.xlst):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="employees">
    <xsl:copy>
      <xsl:apply-templates select="employee">
        <xsl:sort select="salary" data-type="number"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

首先,将它们都放在同一文件夹中。然后使用--allow-file-access-from-files标志启动Google chrome。然后在chrome中打开xml文件。 xml将呈现为:

Hill Graham 89000 Herbert Johnny 95000 Hill Phil 100000 Hill Albert 110000

如您所见,所有xml标记都丢失了。但是,右键单击该页面,然后选择“检查”以启动开发人员控制台。在开发人员控制台中,选择“元素”选项卡。右键单击<employees>顶级标签,然后从菜单中选择“复制->复制externalHTML”。在您选择的文本编辑器中打开一个新文档,然后粘贴转换后的xml。在我的示例中,它看起来像这样:

<employees>
  <employee hireDate="08/20/2000">
    <last>Hill</last>
    <first>Graham</first>
    <salary>89000</salary>
  </employee>
  <employee hireDate="09/01/1998">
    <last>Herbert</last>
    <first>Johnny</first>
    <salary>95000</salary>
  </employee>
  <employee hireDate="04/23/1999">
    <last>Hill</last>
    <first>Phil</first>
    <salary>100000</salary>
  </employee>
  <employee hireDate="08/20/2001">
    <last>Hill</last>
    <first>Albert</first>
    <salary>110000</salary>
  </employee>
</employees>

如您所见,转换后的xml已恢复,现在可以保存。