xpath查找当前节点的值

时间:2011-04-12 22:10:39

标签: xslt xpath

我有几个具有相同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" />

有人可以帮我解决这个问题。在此先感谢。

2 个答案:

答案 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中编写循环。您编写在特定时间点使用特定上下文调用的模板。如果不了解整个计划的背景,我不确定最好的下一步是什么。