2011-08-02 60 views
0

以同樣的方式,你可以做以下...XSLT - value-of的

<xsl:for-each select="catalog/cd[artist='Bob Dylan']"> 

你可以做的價值聲明相同的過濾?

<xsl:value-of select="value[name='Name']" /> 

謝謝, 詹姆斯。

編輯:

對不起,我很困惑。

我有一些XML:

<DynamicData> 
    <item> 
     <name>Name</name> 
     <value xsi:type="xsd:int">0</value> 
    </item> 
    <item> 
     <name>Value</name> 
     <value xsi:type="xsd:long">9</value> 
    </item> 
</DynamicData> 

我想用我的價值的選擇過濾器,很多相同的方式做的,每個時是可能的。我只是開始看XSLT,所以沒有把握它的能力。最後,我使用了以下XSLT:

<set> 
    <xsl:attribute name="name"> 
     <xsl:choose> 
     <xsl:when test="item[name='Name']/value=0">Low</xsl:when> 
     <xsl:when test="item[name='Name']/value=1">Medium</xsl:when> 
     <xsl:when test="item[name='Name']/value=2">High</xsl:when> 
     </xsl:choose> 
    </xsl:attribute> 
    ... 

我有被我把過濾器的值元件之後在測試中,像這樣的問題。 <xsl:when test="item/value[name='Name']=2">High</xsl:when>顯然,「名」元素心不是「價值」的元素,但的「項目」,因此爲什麼沒有工作的元素。

感謝您的幫助大家,我到底:)

+0

什麼是你想要的結果,你能提供一些樣本輸入/輸出嗎? –

+0

更新了我的問題。 – Cadab

回答

1

是,選擇採用XPath表達式作爲它的參數

XSL:value-of

雖然規範規定就可以了,它可以到達那裏取決於你的XML/XSL引擎的實現。

+0

確實有可能,我遇到的問題是我正在對元素進行過濾,可以這麼說。我在做「item/value [name ='Name']」而不是「item [name ='Name']/value」。 'name元素是'item'的元素,而不是'value' – Cadab

1

請記住,在XSLT在someNodeSet

第一節點的只有1.0<xsl:value-of select="someNodeSet"/>輸出的字符串值在另一側

<xsl:for-each select="someNodeSet"> 
<xsl:value-of select="."/> 
</xsl:for-each> 

輸出的每字符串值節點someNodeSet

+1

您正在談論XSLT 1.0。在2.0中,xsl:value-of輸出所有值,空格分隔,並且允許您選擇不同的分隔符。 –

+0

@邁克爾凱:是的。 –

+0

@Michael Kay:編輯答案明確地說:「在XSLT 1.0中」 –

0

請注意,在XSLT 1.0,你可以用xsl:copy-oftext()測試節點解決此。


例如,假設此輸入:

<catalog> 
    <cd> 
     <artist>Bob Dylan</artist> 
    </cd> 
    <cd> 
     <artist>Pink Floyd</artist> 
     <title>ummagumma</title> 
    </cd> 
    <cd> 
     <artist>Pink Floyd</artist> 
     <title>Atom Earth Mother</title> 
    </cd> 
</catalog> 

您可以使用xsl:copy-of如下:

<xsl:copy-of select="catalog/cd[artist='Pink Floyd']/title/text()"/> 

將正好返回所有匹配的節點的值作爲:

<xsl:for-each select="catalog/cd[artist='Pink Floyd']/title"> 
    <xsl:value-of select="."/> 
</xsl:for-each>