1

私は「グループ」ノードにいます。それから、現在の「グループ」ノード「ref_item_id」属性値と等しい「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

これはコンテキストと関係があります。述語を入力するとすぐに、コンテキストは述語によって現在フィルタリングされているノードになり、テンプレートと一致するノードではなくなります。

2つのオプションがあります-変​​数を使用して外部スコープデータをキャッシュし、その変数を述語で参照します

<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と一致するアイテムを検索します。現在のref_item_idをxsl:variableにキャプチャし、式でそのxsl:variableを参照する必要があります。

于 2012-07-01T09:49:18.460 に答える
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が対応する*ノード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 に答える
0

を使用してもう1つの可能な解決策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 に答える