1

だから私はこのコードを持っています:

<xsl:for-each select="item">
<Row>
    <Cell Borders="#ffffff">
      <xsl:attribute name="Background">
        <xsl:choose>
          <xsl:when test="position() mod 2 = 1">#CCCCFF</xsl:when>
          <xsl:when test="position() mod 2 = 0">#FFFFFF</xsl:when>
        </xsl:choose>
      </xsl:attribute>
      <Paddings Left="5" Right="5" Top="2" Bottom="2"/>
      <xsl:for-each select="//queries/query/selection/dataItem">
      <Text Style="TableContent">                                               
        <xsl:value-of select="@name"/>                                                                                        
      </Text>
      </xsl:for-each>   
    </Cell>
    <Cell Borders="#ffffff">
      <xsl:attribute name="Background">
        <xsl:choose>
          <xsl:when test="position() mod 2 = 1">#CCCCFF</xsl:when>
          <xsl:when test="position() mod 2 = 0">#FFFFFF</xsl:when>
        </xsl:choose>
      </xsl:attribute>
      <Paddings Left="5" Right="5" Top="2" Bottom="2"/>
      <Text Style="TableContent">
      <xsl:choose>
      <xsl:when test="qi">
        <xsl:value-of select="qi"/>
      </xsl:when>
      <xsl:otherwise>
        <Text>N/A</Text>
      </xsl:otherwise>
      </xsl:choose> 
      </Text>
    </Cell>
</Row>
</xsl:for-each>

XML から情報を取得しようとしていますが、情報は 2 つの異なる XPATH を持つ 2 つの異なるノードにあります。また、1 つのノードからの情報、つまり名前を一致させる必要があります。別の場所にある別のノードに、別の XPATH で接続します。ノード内の各名前を調べて、すべて同じ XML 内の別のノードで見つかった情報と照合する方法はありますか??

編集 元の XML へのリンクを追加

どうもありがとうございました

4

1 に答える 1

1

expression要素が現在のアイテムのname要素と一致するdataItem要素にアクセスしようとしているようです。

この場合、の値でdataItemレコードを検索するためのキーを作成できます

<xsl:key name="dataItems" match="dataItem" use="expression" />

次に、現在行っているようにすべてのdataItemレコードをループする代わりに...

<xsl:for-each select="//queries/query/selection/dataItem"> 

この行を置き換えると、キーを使用して、関連する値を持つdataItemのみを反復処理できます。

 <xsl:for-each select="key('dataItems', name)">

ここで、nameは、現在配置されている現在のitem要素の下にあるname要素です。

xsl:key要素をコンテキストで表示するためのより完全なXSLTを次に示します。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>

   <xsl:key name="dataItems" match="dataItem" use="expression"/>

   <xsl:template match="root">
      <xsl:apply-templates select="lineage"/>
   </xsl:template>

   <xsl:template match="lineage">
      <xsl:for-each select="item">
         <Row>
            <Cell Borders="#ffffff">
               <xsl:attribute name="Background">
                  <xsl:choose>
                     <xsl:when test="position() mod 2 = 1">#CCCCFF</xsl:when>
                     <xsl:when test="position() mod 2 = 0">#FFFFFF</xsl:when>
                  </xsl:choose>
               </xsl:attribute>
               <Paddings Left="5" Right="5" Top="2" Bottom="2"/>
               <xsl:for-each select="key('dataItems', name)">
                  <Text Style="TableContent">
                     <xsl:value-of select="@name"/>
                  </Text>
               </xsl:for-each>
            </Cell>
            <Cell Borders="#ffffff">
               <xsl:attribute name="Background">
                  <xsl:choose>
                     <xsl:when test="position() mod 2 = 1">#CCCCFF</xsl:when>
                     <xsl:when test="position() mod 2 = 0">#FFFFFF</xsl:when>
                  </xsl:choose>
               </xsl:attribute>
               <Paddings Left="5" Right="5" Top="2" Bottom="2"/>
               <Text Style="TableContent">
                  <xsl:choose>
                     <xsl:when test="qi">
                        <xsl:value-of select="qi"/>
                     </xsl:when>
                     <xsl:otherwise>
                        <Text>N/A</Text>
                     </xsl:otherwise>
                  </xsl:choose>
               </Text>
            </Cell>
         </Row>
      </xsl:for-each>
   </xsl:template>
</xsl:stylesheet>
于 2012-08-03T12:29:58.723 に答える