XSL:复制XML然后替换一些标签

时间:2011-10-04 17:48:52

标签: xml xslt

我是XSL / XSLT的新手。我想将一个xml文档复制到另一个文件中,但是要替换一些命名空间标记和一些具有某些特殊属性的标记。例如:

<root>
  <ext:foo>Test</ext:foo>
  <bar>Bar</bar>
  <baz id="baz" x="test">
    <something/>
  </baz>
</root>

应该改写成:

<root>
  --Test--
  <bar>Bar</bar>
  xxx<baz id="baz">
    <something/>
  </baz>xxx
</root>

是否可以复制整个XML,然后应用一些规则来替换我想要替换的标签?

2 个答案:

答案 0 :(得分:6)

您可以复制某些节点并使用不同的规则重写其他节点。要保持<root><bar>相同,并重新编写<baz>,请尝试以此方式(未经测试)作为起点:

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

  <!-- Match <baz> and re-write a little -->
  <xsl:template match="baz">
    xxx<baz id="{@id}">
     <xsl:apply-templates />
    </baz>xxx
  </xsl:template>

  <!-- By default, copy all elements, attributes, and text -->
  <xsl:template match="@* | node()">
<xsl:copy>
  <xsl:apply-templates select="@* | node()"/>
</xsl:copy>
  </xsl:template>


</xsl:stylesheet>

答案 1 :(得分:0)

假设你的.xml文件对于ext:xmlns:ext =“www.foo.com”具有相同的命名空间,这个xslt会产生你的输出,虽然你必须把它带上一粒盐,因为它没有完全检查什么,只为这个特定情况产生你的输出。

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

  <xsl:template match="/root">
    <root>

      <xsl:text>--</xsl:text><xsl:value-of select="./ext:foo/text()"/><xsl:text>--</xsl:text>
      <xsl:copy-of select="./bar"/>
      <xsl:variable name="bazElem" select="./baz"/>
      <xsl:text>xxx</xsl:text><baz id="{$bazElem/@id}">
        <xsl:copy-of select="$bazElem/something"/>
      </baz><xsl:text>xxx</xsl:text>
    </root>
  </xsl:template>
</xsl:stylesheet>