1

我在“组”节点中。从中,我想找到这样的“项目”节点,它的“id”属性等于当前的“组”节点“ref_item_id”属性值。因此,在我的情况下,通过在“组”节点 B 中,我希望“项目”节点 A 作为输出。这有效:

<xsl:value-of select="preceding-sibling::item[@id='1']/@description"/>

但这没有(什么都不提供):

<xsl:value-of select="preceding-sibling::item[@id=@ref_item_id]/@description"/>

当我输入:

<xsl:value-of select="@ref_item_id"/>

结果我有'1'。所以这个属性肯定是可访问的,但我无法从上面的 XPath 表达式中找到它的路径。我尝试了许多 '../' 组合,但无法正常工作。

测试代码:http ://www.xmlplayground.com/7l42fo

完整的 XML:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <item description="A" id="1"/>
    <item description="C" id="2"/>
    <group description="B" ref_item_id="1"/>
</root>

完整的 XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="text" indent="no"/>
  <xsl:template match="root">
     <xsl:for-each select="group">
        <xsl:value-of select="preceding-sibling::item[@id=@ref_item_id]/@description"/>
     </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>
4

4 回答 4

8

这与上下文有关。一输入谓词,上下文就变成了当前被谓词过滤的节点,不再是模板匹配的节点。

您有两个选择 - 使用变量来缓存外部范围数据并在谓词中引用该变量

<xsl:variable name='ref_item_id' select='@ref_item_id' />
<xsl:value-of select="preceding-sibling::item[@id=$ref_item_id]/@description"/>

或使用该current()功能

<xsl:value-of select="preceding-sibling::item[@id=current()/@ref_item_id]/@description"/>
于 2012-07-01T09:51:46.190 回答
1

您的表达式搜索其 id 属性与其自己的 ref_item_id 匹配的项目。您需要在 xsl:variable 中捕获当前 ref_item_id 并在表达式中引用该 xsl:variable。

于 2012-07-01T09:49:18.460 回答
0

另一种可能的解决方案是使用xsl:key

<xsl:key name="kItemId" match="item" use="@id" />

<xsl:template match="root">
    <xsl:for-each select="group">
        <xsl:value-of select="key('kItemId', @ref_item_id)[1]/@description"/>
    </xsl:for-each>
</xsl:template>
于 2012-07-01T10:35:45.810 回答
0

查看 XML,如果我假设您有<item><group>作为兄弟姐妹并且以任何顺序。然后示例输入 XML 将如下所示。

 <?xml version="1.0" encoding="UTF-8"?>
    <root>
        <item description="A" id="1"/>
        <item description="C" id="2"/>
        <group description="B" ref_item_id="1"/>
        <item description="D" id="1"/>
        <group description="E" ref_item_id="2"/>
    </root>

现在,如果目标是提取id与对应的*nodes ref_item_id*匹配的所有<item>节点的描述。然后我们可以简单地只遍历这些节点并获取它们的描述。<group><item>

    <xsl:output method="text" indent="no"/>
      <xsl:template match="root">
         <xsl:for-each select="//item[(./@id=following-sibling::group/@ref_item_id) or (./@id=preceding-sibling::group/@ref_item_id)]">
            <xsl:value-of select="./@description"/>
         </xsl:for-each>
      </xsl:template>
    </xsl:stylesheet>

既然您说节点具有唯一的 ID,并且所有节点都放在节点之前。我建议您使用以下 XSL 并在特定节点而不是节点上循环。

 <xsl:output method="text" indent="no"/>
      <xsl:template match="root">
         <xsl:for-each select="//item[./@id=following-sibling::group/@ref_item_id]">
            <xsl:value-of select="./@description"/>
         </xsl:for-each>
      </xsl:template>
    </xsl:stylesheet>
于 2012-07-01T10:27:58.720 回答