XSLT默认情况下替换标记值

时间:2013-10-30 15:57:12

标签: xml xslt xpath

我有这个XML文档:

<Document>
    <a>
        <b>
            <c1>CCC111</c1>
            <c2>CCCC222</c2>
        </b>
        <d>
            <d1>DDD111</d1>
            <d2>DDD222</d2>
            <d3>DDD333</d3>
        </d>
</a>
</Document>

我想用XXXXXX替换Document / a / d / d1的值:

<Document>
    <a>
        <b>
            <c1>CCC111</c1>
            <c2>CCCC222</c2>
        </b>
        <d>
            <d1>XXXXXX</d1>
            <d2>DDD222</d2>
            <d3>DDD333</d3>
        </d>
</a>
</Document>

我有这个XSLT:

    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="Document/a/d/d1/text()">
       XXXXXX
 </xsl:template>

</xsl:stylesheet>

但我获得了相同的输入和输出:/

谢谢。

3 个答案:

答案 0 :(得分:2)

  

在我的输入文件中,我有:<Document xmlns="tatatta" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="totoot">

这意味着文档中的元素位于tatatta命名空间中,因为XPath 1.0中没有前缀的名称总是引用模板不匹配的非命名空间元素。您需要将命名空间映射到前缀并在模式中使用它,例如:

<xsl:template match="t:Document/t:a/t:d/t:d1/text()"
              xmlns:t="tatatta">
  <xsl:text>XXXXXX</xsl:text>
</xsl:template>

(或者您可以将xmlns:t放在xsl:stylesheet而不是模板上,如果您需要在其他地方使用相同的命名空间。)

答案 1 :(得分:1)

我猜想在某个地方有一个简单的转录错误。虽然您可以稍微简化XXXXXX覆盖模板:

<xsl:template match="d1/text()">XXXXXX</xsl:template>

您发布的内容按原样运行,并说明您的概念是正确的。我可以确认您发布的内容适用于XSLT 2.0(Saxon HE)和XSLT 1.0(Saxon 6.5.5)处理器。

发现命名空间定义后更新:

好的,因此输入XML文档的元素位于命名空间中。没问题,只需为tatatta命名空间声明一个名称空间前缀,并调整template/@match来计算命名空间,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:t="tatatta">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="node()|@*">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="t:d1/text()">XXXXXX</xsl:template>

</xsl:stylesheet>

答案 2 :(得分:0)

     <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output indent="yes"/>

     <xsl:template match="node()|@*">
         <xsl:copy>
           <xsl:apply-templates select="node()|@*"/>
         </xsl:copy>
     </xsl:template>

   <xsl:template match="Document/a/d/d1/text()[.='DDD111']">XXXXXX </xsl:template>

    </xsl:stylesheet>