XSL替换标签/元素并重新保存文件?

时间:2014-06-27 13:49:31

标签: xml xslt

我在XSL功能方面没有很多经验。

我有各种各样的现有文件,并且会有一堆不断的新文件,这些文件是各种各样的'风味' XML。 NITF等。

我想要做的是处理所有XML文件,并用新元素名称替换某些元素,然后重新保存它们。

使用Oxygen作为应用程序。这些文件最终将被DAM摄取。

即。在XML文件中,以下代码:

<abstract>
    <hl2>Mercy for Animals doesn’t work on tips. Its investigators go where they get hired, with cameras.</hl2>
</abstract>

我想制作此代码:

<title>
    <hl2>Mercy for Animals doesn’t work on tips. Its investigators go where they get hired, with cameras.</hl2>
</title>

这样就可以简单地搜索和替换XML文件,然后将它们重新保存,保存文件名等,并保留结构等。

代码可以添加不同的转换吗?

基本上,原因是从各种来源将各种XML文件摄取到我们DAM所需的XML格式中。也许是XSL-FO?

1 个答案:

答案 0 :(得分:1)

如果您遇到的XSLT问题相当于“保持大部分内容相同但调整X,Y和Z”,那么标准答案就是使用“身份转换”。这是一个单独的模板,它将输入文档复制到输出,但可以被其他更具体的模板选择性地覆盖以进行修改。最基本的意思是

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

  <!-- identity template - copy everything verbatim except for ... -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
  </xsl:template>

  <!-- ... abstract elements, which we rename to title -->
  <xsl:template match="abstract">
    <title>
      <xsl:apply-templates select="@*|node()" />
    </title>
  </xsl:template>
</xsl:stylesheet>

但如果输入文档涉及任何名称空间,则需要适当调整匹配表达式。例如。如果输入文档有xmlns="http://example.com",那么文档中所有未加前缀的元素都属于该命名空间,并且为了在XSLT中匹配它们,您需要创建一个前缀绑定并在match中使用它:

<xsl:stylesheet ....
      xmlns:ex="http://example.com">

  <xsl:template match="ex:abstract">

作为匹配模式中的无前缀名称和XPath表达式总是表示没有名称空间中的节点。