我有几个具有相同Name ='UPC'的节点,我需要找到当前的值。
<XML>
<Attribute>
<Name>UPC</Name>
<Type>ComplexAttr</Type>
<Value>Testing</Value>
</Attribute>
<Attribute>
<Name>UPC</Name>
<Type>ComplexAttr</Type>
<Value>24a</Value>
</Attribute>
</XML>
预期输出 它应该从/ Attribute / Value中提取值,其中Name ='UPC'和Type ='ComplexAttr'。
在第一次运行='测试'&amp; 在第二次运行时,值应为='24a'
我正在尝试使用以下代码,但它无效。该值为null。
<xsl:attribute name ="value">
<xsl:value-of select =".//Attribute[Type='ComplexAttr' and Name = 'UPC'][$i]/Value" />
</xsl:attribute>
其中 $ i 是我用来循环上面的xml的变量,它在每次运行后递增。但是,它只会在每次运行中为我提供相同的值“测试”(这是第一个值)。我检查了变量的值。它每次循环都在变化。
我也尝试过使用current()和position(),但是在这种情况下我得到null。
<xsl:value-of select =".//Attribute[Type='ComplexAttr' and Name = 'UPC'][current()]/Value" />
<xsl:value-of select =".//Attribute[Type='ComplexAttr' and Name = 'UPC'][position() = $i]/Value" />
有人可以帮我解决这个问题。在此先感谢。
答案 0 :(得分:4)
这是最大的常见问题解答之一:
[]
运算符绑定比//
缩写更强。
为了选择XML文档中的第一个元素,它满足谓词中的特定条件,请使用:
(//Attribute[Type='ComplexAttr' and Name = 'UPC'])[1]/Value
为了在XML文档中选择满足谓词中特定条件的第二个元素,请使用:
(//Attribute[Type='ComplexAttr' and Name = 'UPC'])[2]/Value
为了在XML文档中选择满足谓词中特定条件的$i
元素,请使用:
(//Attribute[Type='ComplexAttr' and Name = 'UPC'])[position() = $i]/Value
答案 1 :(得分:2)
您不能在XPath表达式中使用变量。尝试手动使用常量,你会发现它有效:
<xsl:value-of select=".//Attribute[Type='ComplexAttr' and Name='UPC'][2]/Value" />
通常,即使语法允许,您也不会在XSLT中编写循环。您编写在特定时间点使用特定上下文调用的模板。如果不了解整个计划的背景,我不确定最好的下一步是什么。