2011-08-02 58 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>