2012-08-02 63 views
1

所以我有这样的代码:XML/XSLT:在XSLT中从XML中的两个不同节点获取信息?

<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

非常感谢您

+0

是的,这的确听起来可能,可能使用一个xsl:键,例如,但我们真的需要查看您的XML示例以提供更具体的帮助。如果你编辑你的问题来展示一个有意义的XML样本,那将会很有帮助。谢谢! – 2012-08-02 21:25:27

+0

对不起,我忘记提供的XML链接之前,但我现在添加了链接。希望它有一点帮助。我试图抓住沿袭信息并将匹配下的名称节点与查询中的dataItem节点下的表达式匹配。 – 2012-08-02 21:54:54

+0

请编辑问题并在问题中提供一个XML文档(小)。请提供确切的通缉结果并解释变革必须实施的任何要求。 – 2012-08-03 01:58:41

回答

1

看起来你是在试图访问DataItem的元素,其中的表达元件的电流项的元素相匹配。

在这种情况下,你可以创建一个键由他们表达

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

然后查找的DataItem记录,而不是通过所有的DataItem记录循环就像你正在做的目前。 ...

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

您可以将此行替换为仅使用该键仅迭代那些dataItems相关值

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

这里,是你当前位于当前项目元素的name元素。

下面是一些更全面的XSLT,以显示XSL:关键元素在上下文中

<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> 
+0

我尝试在我的xslt中使用密钥,并且出现此错误,“'xsl:key'不是公认的扩展元素”。我还需要声明模板上方还是Cell节点内部的密钥? – 2012-08-03 19:49:20

+0

xsl:key应该是一个stand XSLT函数。它应该超出任何xsl:模板。 – 2012-08-03 20:53:01

+0

我按照自己的方式编辑了我的代码,但仍然出错。我相信这可能是因为我使用样式表2.0版?那有可能吗?我查了很多例子,他们似乎都使用xsl样式表1.0。 – 2012-08-06 15:08:51