【问题标题】:XML/XSLT: pulling information from two different nodes from XML in XSLT?XML/XSLT:从 XSLT 中的 XML 中提取两个不同节点的信息?
【发布时间】:2012-08-02 20:36:07
【问题描述】:

所以我有这个代码:

<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 中的另一个节点中找到的信息相匹配?

编辑 Added link to original XML

非常感谢

【问题讨论】:

  • 是的,这听起来确实可行,例如可能使用 xsl:key,但我们确实需要查看您的 XML 示例以提供更具体的帮助。如果您编辑您的问题以显示有意义的 XML 示例,那将有很大帮助。谢谢!
  • 对不起,我之前忘记提供 xml 的链接,但我现在已经添加了链接。希望它有一点帮助。我正在尝试获取沿袭信息并将沿袭下的名称节点与查询中的 dataItem 节点下的表达式匹配。
  • 请编辑问题并在问题中提供一个 XML 文档(小)。请同时提供所需的确切结果并解释转换必须实现的任何要求。

标签: xml xslt


【解决方案1】:

您似乎正在尝试访问 expression 元素与当前项目的 name 元素匹配的 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>

【讨论】:

  • 我尝试在我的 xslt 中使用密钥,但出现此错误,“'xsl:key' 不是可识别的扩展元素”。我还必须在模板上方或 Cell 节点内部声明密钥吗?
  • xsl:key 应该是一个标准的 XSLT 函数。它应该在任何 xsl:template 之外。
  • 我按照您的方式编辑了我的代码,但仍然出错。我相信这可能是因为我使用的是样式表 2.0 版?这可能吗?我查找了许多示例,它们似乎都使用 xsl 样式表 1.0。
  • 仅供参考,这让我很失望:
  • 我是否可以检索每个数据项 -> 表达式来自的查询名称?我试图使用 for-each 语句。基本上检索到的每个数据项名称,我也希望能够获取查询名称。那可能吗? @蒂姆
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多