如何使用xslt更改已存在的值的整个元素?

时间:2011-01-17 16:04:27

标签: xml xslt xpath

我有一些带有标题的原始文件,我想为另一个标题更改(存储在其他文件中):

原始档案:

<doc1>
    <header>
        <a>aaaa</a>
        <b>bbbb</b>
    </header>
    <content>
      <z>zzzzzzzzzzzzz</z>
    </content>
</doc1>

新标题(在文件中):

<header>
    <c>cccc</c>
</header>

预期结果:

    <doc1>
    <header>
        <c>cccc</c>
    </header>
    <content>
      <z>zzzzzzzzzzzzz</z>
    </content>
</doc1>

提前致谢!

2 个答案:

答案 0 :(得分:1)

如果要使用外部文档,则需要使用xslt文档函数。

例如/

http://www.ibm.com/developerworks/xml/library/x-tipcombxslt/ http://www.xml.com/pub/a/2002/03/06/xslt.html

答案 1 :(得分:1)

此转换(仅限演示目的,新标头嵌入在XSLT样式表中):

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

 <my:header>
   <header>
    <c>cccc</c>
   </header>
 </my:header>

 <xsl:variable name="vHeaderDoc" select="document('')/*/my:header"/>
    <xsl:template match="node()|@*">
      <xsl:copy>
         <xsl:apply-templates select="node()|@*"/>
      </xsl:copy>
    </xsl:template>

    <xsl:template match="header">
     <xsl:copy-of select="$vHeaderDoc/*"/>
    </xsl:template>
</xsl:stylesheet>

应用于提供的XML文档

<doc1>
    <header>
        <a>aaaa</a>
        <b>bbbb</b>
    </header>
    <content>
        <z>zzzzzzzzzzzzz</z>
    </content>
</doc1>

生成想要的正确结果

<doc1>
    <header xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:my="my:my">
    <c>cccc</c>
   </header>
    <content>
        <z>zzzzzzzzzzzzz</z>
    </content>
</doc1>

真实的案例中,您将拥有

 <xsl:variable name="vHeaderDoc" select="document('Header.xml')"/>

并且header文档将位于名为'Header.xml'的文件中,该文件与XSLT样式表位于同一目录中(如果在另一个目录中,则相应地更改文档URL)。

在实际情况中,xsl:元素上不会复制header命名空间节点。

请注意:使用标准XSLT函数 document()