我一直在絞盡腦汁,但似乎無法正確使用,而且我沒有找到正確的關鍵字Google ..在使用XPath的複雜XML元素中選擇白色空間文本節點中的子文本節點
我最近開始使用XSLT和XPath來創建自然語言詞彙表的XML描述 - 用於我的項目。
問題是我選擇了對某些單詞使用「混合內容」複雜元素,並且在某些情況下只想獲取文本節點。
這裏的XML文檔的一部分:
...
<entry category="substantiv">
<word lang="sv">semester</word>
<word lang="de">
<article>der</article>Urlaub
<plural>Urlaube</plural>
</word>
</entry>
...
有我的文檔中的許多入門元素,在這種情況下我想通過獲取「Urlaub」:/entry/word[@lang='de']/text()
這是因爲我的換行符的,不會工作。我發現實際上有三個文本節點.. .../text()[2]
當然會工作..但是,我不知道哪裏會有換行符,或者有多少。如果XML被格式化像下面,我該路徑的第一個版本將工作,但不是第二:
...
<word lang="de"><article>der</article>Urlaub
<plural>Urlaube</plural>
</word>
...
我覺得我想要做的是選擇所有字的直接文本節點[@ LANG =」 de'],然後使用normalize-space()
刪除不必要的空白區域。但是,如何使用XPath執行此操作?或者,還有更好的方法?這似乎很容易,但我無法弄清楚。我正在嘗試在XSLT文檔中執行此操作。
normalize-space(/entry/word[@lang='de']/text()[*])
是我試過的東西之一,但似乎做了別的事情。
/感謝您的幫助。
更新:
這裏是XSLT的一部分,要求:
...
<xsl:choose>
<xsl:when test="@category='substantiv'">
<em><xsl:value-of select="word[@lang='de']/article" /></em>
<xsl:value-of select="normalize-space(word[@lang='de']/text()[2])" />
<em>pl. <xsl:value-of select="word[@lang='de']/plural" /></em>
</xsl:when>
...
此代碼工作得很好用格式化的第一個版本。爲了澄清,我想要做的是對複雜元素<word lang="de">
中的文本節點的值進行繪圖,儘管可能會用換行符和空格來格式化。我將如何處理價值取決於上下文,但現在我將它放在一個xhtml文檔中。
UPDATE2: 我現在用的<xsl:strip-space elements="*"/>
這消除了空文本節點的問題。我也使用:
...
<xsl:choose>
<xsl:when test="@category='substantiv'">
<em><xsl:value-of select="word[@lang='de']/article" /></em>
<xsl:text> </xsl:text>
<xsl:value-of select="normalize-space(word[@lang='de']/text())" />
<xsl:text>, </xsl:text>
<em>pl. <xsl:value-of select="word[@lang='de']/plural" /></em>
</xsl:when>
...
還是要正常化,雖然由於空間的XML「Urlaub」後,仍然增加。
當我需要達到的文本節點「Urlaub」的XSLT文檔之外我用:
<xsl:value-of select="normalize-space(word[@lang='de']/text()[normalize-space() != ''])" />
感謝所有幫助鄉親!
更新3: 試圖改善標題
如果沒有相關的XSLT上下文,就無法自信地回答。請添加您正在努力解決的問題的XSLT代碼以及您的實際意圖(即所需輸出)。 – Tomalak 2010-08-09 18:50:17
@Tomalak,我沒有在XSLT,只有XPath部分掙扎。但我補充說,以防萬一它可能擺脫一些需要的光。 – nimbus77 2010-08-09 20:57:15
除了重點之外,你並沒有在XSLT中掙扎。 ;)顯示你的代碼是有幫助的,因爲XSLT和XPath是如此密切相關,許多問題可能有與你目前嘗試的不同的解決方案。 - 看到我改變的答案。 – Tomalak 2010-08-09 21:11:09