2013-10-30 46 views
2

更換標籤值我有這樣的XML文檔:XSLT默認

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

我要替換文件的價值/ A/d/D1由XXXXXX:

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

但我獲得相同的輸入和輸出:/

謝謝。

+0

你''標籤沒有關閉 - 打開兩次。 – kjhughes

+0

謝謝,但這個錯誤只是在帖子上,我的XML是有效的 –

+0

適用於我使用xsltproc ...您使用的是什麼XSLT處理器? –

回答

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

好吧,它運行時有一個,但在我的輸入文件中我有:

+0

@ l4r3nZu啊,那就解釋吧!沒問題。上面更新的答案說明了名稱空間。 – kjhughes

+0

感謝它工作正常:)我有可能加入和我的XML的值:

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:txsl:stylesheet而不是在模板時,如果需要使用相同的命名空間中其他地方)。

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>