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 中提取信息,但是该信息位于两个不同的节点中,具有两个不同的 XPATH。我还需要匹配来自一个节点的信息,即名称。到位于不同位置下的另一个节点,具有不同的 XPATH。有没有办法遍历节点中的每个名称并将其与在同一 XML 中的另一个节点中找到的信息相匹配?

编辑 添加到原始 XML 的链接

非常感谢你

4

1 回答 1

1

看起来您正在尝试访问表达式元素与当前项目的名称元素匹配的dataItem元素。

在这种情况下,您可以创建一个键来通过它们的表达式值查找dataItem记录

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

然后,而不是像你目前正在做的那样遍历所有dataItem记录......

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

您可以替换此行以简单地使用键仅迭代具有相关值的那些数据项

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

这里,name是您当前所在的当前item元素下的 name 元素。

这是一些更完整的 XSLT,用于在上下文中显示xsl:key元素

<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 回答