根据另一个ref-attribute的值中的ID属性选择节点

时间:2016-02-22 20:25:07

标签: xml xslt xpath

我有这个伪xml:

<list>
    <entry id="1">
        <item>Item 1</item>
        <link ref="2"/>
    </entry>
    <entry id="2">
        <item>Item 2</item>
    </entry>
</list>

我希望在属性选择的模板中获取<item> - 节点:

<xsl:template match="link">
    <xsl:value-of select="/list/entry[@id=./@ref]/item"/>
</xsl:template>

当我手动输入/list/entry[@id='2']/item时,它会起作用,但我需要它有点动态。 当我调试它时,./@ref(以及@ref}是2的正确值。

我在这里想念什么?

1 个答案:

答案 0 :(得分:1)

原因是:

<xsl:template match="link">
    <xsl:value-of select="/list/entry[@id=./@ref]/item"/>
</xsl:template>

不起作用是因为当entry属性等于id属性时,xpath正在尝试选择ref。 (您需要使用current()/@ref。)

但是,我建议使用xsl:key根据entry属性创建所有id元素的键...

XML输入

<list>
    <entry id="1">
        <item>Item 1</item>
        <link ref="2"/>
    </entry>
    <entry id="2">
        <item>Item 2</item>
    </entry>
</list>

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:key name="entries" match="entry" use="@id"/>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="link">
    <test>
      <xsl:value-of select="key('entries',@ref)/item"/>      
    </test>
  </xsl:template>

</xsl:stylesheet>

XML输出

<list>
   <entry id="1">
      <item>Item 1</item>
      <test>Item 2</test>
   </entry>
   <entry id="2">
      <item>Item 2</item>
   </entry>
</list>