2012-12-02 43 views
0

以該元素的名稱和整數結合使用XPath CONCAT()給出的以下的XPath XSL CONCAT

<ZIP0>10015</ZIP0> 
<ZIP1>10016</ZIP1> 
... 
<ZIP99>10016</ZIP99> 

IM:

<ZIP><xsl:value-of select="concat('ZIP','0')"/></ZIP> 

CONCAT返回文本字符串...

<ZIP>ZIP0</ZIP> 

當然,暗示的是,

<ZIP>10015</ZIP> 

如何評估從concat返回的字符串表達式。

,這也提供了相同的結果:

<xsl:variable name="tmp" select="concat('ZIP','0')"/> 
<ZIP><xsl:value-of select="$tmp"/></ZIP> 

事實上,它的評價一樣,

<xsl:value-of select="'ZIP0'"/> 

反對

<xsl:value-of select="ZIP0"/> 

歡呼

+0

請,*編輯*的問題,並提供一個實際的,完整的,格式良好的XML文檔。如果沒有這一點,答案中提供的任何特定XPath表達式都可能不會在文檔中選擇我們未顯示的想要的節點。 -1。 –

回答

4

簡短的回答:

<ZIP><xsl:value-of select="*[name() = concat('ZIP','1')]"/></ZIP> 

朗的答案 - 在類似下面的表達式:

<xsl:value-of select="ZIP1"/> 

ZIP1實際上是簡寫child::ZIP1這意味着(大約)尋找匹配ZIP1名稱的子元素。文本ZIP1被稱爲名稱測試。不幸的是,沒有辦法從字符串中動態地建立名稱測試。您必須完全指定名稱或使用通配符*

由於我們不知道確切的名稱,我們別無選擇,只能使用通配符*後跟一個謂詞表達式,它會過濾掉我們不感興趣的節點。謂詞將在我們的每個節點上調用名單。 name()方法將返回被測節點的標籤名稱,所以我們所要做的就是確保名稱等於我們想要的字符串。

更多信息參見http://www.w3.org/TR/xpath

+0

謝謝 不幸的是沒有按預期工作。 ' />' –

+0

aha。我相信問題在於我不在根。因此,'我們列表中的每個節點'都不包含ZIP1。 –

+0

你的建議確實在根元素上工作。 –