2010-05-25 69 views
2

下的所有文本(包括節點名稱),我現在有一個XML文件是這樣的:我想選擇一個節點

<aaa> 
    <b>I am a <i>boy</i></b>. 
</aaa> 

我怎樣才能得到確切的字符串:<b>I am a <i>boy</i></b>.?謝謝。

+0

你必須使用xslt嗎?怎麼樣xml解析器+ xpath? – 2010-05-25 01:45:40

+0

請不要將標籤(如「[xslt]」)放入標題行。這就是標籤的用途。 – 2010-05-25 01:55:18

+0

好問題(+1)。請參閱我的回答以獲得解釋和完整但簡短的解決方案。 :) – 2010-05-25 02:23:07

回答

2

您必須告訴XSLT您也想要複製元素。這可以通過附加規則來完成。請注意,我在apply-templates元素上使用自定義選擇子句來選擇屬性以及所有節點類型對象。還要注意,aaa的規則優先,並且而不是將aaa元素本身複製到輸出。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="aaa"> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:template> 
    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
2
<aaa> 
    <b>I am a <i>boy</i></b>. 
</aaa> 

我怎樣才能得到確切的字符串: <b>I am a <i>boy</i></b>

你的情況要做到這一點,最簡單的/最簡單的辦法是輸出以下XPath表達式結果:

/*/node()

這意味着:「選擇所有節點是頂級元素的子節點。「

當然,有一些我們不希望選擇的純空白文本節點,但XSLT可以處理這個問題,所以XPath表達式就像上面所示的那樣簡單。

現在,爲了得到與XSLT轉換的結果,我們使用以下

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

<xsl:template match="/"> 
    <xsl:copy-of select="/*/node()"/> 
</xsl:template> 
</xsl:stylesheet> 

當這種變換所提供的XML文檔應用,想要的結果產生

<b>I am a <i>boy</i></b>. 

請注意

  1. 使用該<xsl:copy-of> XSLT指令(未<xsl:value-of>),其拷貝節點,不字符串值。

  2. 使用<xsl:strip-space elements="*"/> XSLT指令,指示XSLT處理器忽略XML文檔中任何只包含空白的文本節點。

+0

這表明:XSLT可以做XPath可以做的任何事情。 :-)請注意,使用此方法會失去遞歸可調性。 – 2010-05-25 02:29:00

+0

它缺少「。」。xpath應該是這樣的:'',它會被序列化爲輸出,形成,但是被要求的字符串。 – 2010-05-25 02:34:49

+0

@ Mads-Hansen:謝謝,我沒有注意到「。」 - 以爲這是一個標題結束問題中的句子。 我相應地更新了我的答案。 – 2010-05-25 03:44:19

相關問題