XSL:复制XML并替换一些标记。

5

我对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,然后应用一些规则来替换我想要替换的标签?


可以在重写时应用您想要的规则。 - FailedDev
请问您能否给我一个例子,说明如何做到这一点? - stofl
1
对于“复制除某些例外之外的所有内容”,您可以使用身份模板(如Carl Raymond的答案所示)。还可以查看此页面以获取更多示例:http://www.xmlplease.com/xsltidentity。 - Joan Charmant
2个回答

7
您可以复制一些节点并使用不同的规则重新编写其他节点。为了保持<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>

啊,我只需要把一些规则一个接一个地写下来就可以链接它们。非常感谢! - stofl

0
假设您的 .xml 文件具有相同的扩展命名空间: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>

谢谢你的回答和代码。我忘了提到XML的结构是不确定的,所以我不能这样做。对于缺乏清晰度,我感到抱歉。 - stofl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接