3

我有这个 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>

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

谢谢你。

4

3 回答 3

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

于 2013-10-30T16:28:06.800 回答
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>
于 2013-10-30T16:20:04.757 回答
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>
于 2015-05-07T11:06:58.973 回答