【问题标题】:XSL: Copy XML and then replace some tagsXSL:复制 XML,然后替换一些标签
【发布时间】:2011-10-04 17:48:52
【问题描述】:

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

【问题讨论】:

  • 可以在重写时应用你想要的规则。
  • 你能给我举个例子吗,我是怎么做到的?
  • 对于“复制所有内容,但有一些例外”,您使用身份模板(如 Carl Raymond 的回答)。另请查看this page 以获取更多示例。
  • 感谢您提供此链接。

标签: xml xslt


【解决方案1】:

您可以复制一些节点并使用不同的规则重写其他节点。要保持&lt;root&gt;&lt;bar&gt; 相同,并重写&lt;baz&gt;,请尝试以下(未经测试)作为起点:

<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>

【讨论】:

  • 啊,所以我可以把一些规则一一写下来。非常感谢!
【解决方案2】:

假设您的 .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>

【讨论】:

  • 感谢您的回答和代码。我忘了提到xml的结构没有确定。所以我不能走这条路。抱歉,不清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多