2010-05-22 56 views
8

我需要改變以下XML文檔:XSLT:改變節點內部文本

<a> 
    <b/> 
    <c/> 
    myText 
</a> 

成這樣:

<a> 
    <b/> 
    <c/> 
    differentText 
</a> 

所以,我寫了這個XSLT文件

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

    <xsl:template match="https://stackoverflow.com/a/text()"> 
    <a> 
     <b/> 
     <c/> 
     differentText 
    </a> 
</xsl:template> 
</xsl:stylesheet> 

這方式,我得到以下結果:

<?xml version="1.0" encoding="utf-8"?> 
<a> 
    <b /><c /> 
    differentText 
</a> 
<a> 
    <b /><c /> 
    differentText 
</a> 
<a> 
    <b /><c /> 
    differentText 
</a> 

結果出現重複3次,因爲3場比賽正在進行。爲什麼?我可以修復它嗎?由於

+0

好問題(+1)。查看我的答案以獲得更好,更簡單的解決方案,在特定模板的匹配表達式中不需要任何謂詞。 – 2010-05-22 16:57:11

回答

8

排除唯一whtespace文本節點。知道並使用<xsl:strip-space>指令

這種轉變

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

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

<xsl:template match="a/text()"> 
    <xsl:text>Diferent text</xsl:text> 
</xsl:template> 
</xsl:stylesheet> 

當應用於提供的XML文檔,產生了想正確的結果

在特定模板的匹配表達式中不需要複雜謂詞

我們應該追求最簡單,最短,最優雅,最具可讀性,最易懂的解決方案,充分利用該語言的力量。

很可能這種解決方案最容易理解,最容易實現,並且很可能被任何XSLT處理器優化,從而實現最高效的實現。

+0

順便說一句,我不認爲'[normalize-space()!='']'一個特別複雜的謂詞。 ;) – Tomalak 2010-05-22 17:12:30

+0

@Tomalak:我們應該追求最簡單,最短,最優雅,最易讀,最易理解的解決方案,它可以充分利用語言的力量。很有可能這種解決方案最容易理解,最容易實現,並且很可能被任何XSLT處理器優化,從而實現最高效的實現。 :) – 2010-05-22 17:17:21

6

三場比賽中,所強調的用方括號:

<a>[ 
    ]<b/>[ 
    ]<c/>[ 
    myText 
]</a> 

你想要的東西,如:

<xsl:template match="https://stackoverflow.com/a/text()[normalize-space() != '']"> 
+0

正如我的答案所示,匹配表達式中不需要謂詞。 :) – 2010-05-22 16:58:07

+4

@Dimitre:我知道。我的答案提供了對現有代碼儘可能少的更改。它的基礎是假設實際代碼更復雜,並且''可能會在其他地方產生副作用。 – Tomalak 2010-05-22 17:02:18

+0

@Tomalak:假設OP沒有說的東西經常使得解決方案不是最理想的,並且更難理解,甚至令人困惑。按照這種方式,我們最終可能會告訴我們所有關於XSLT的知識 - 「以防萬一......」:) – 2010-05-22 17:45:27