在xslt的嵌套循环中运行if语句时遇到问题

时间:2016-02-03 12:04:13

标签: xml xslt

我使用xslt转换我的xml,只有property int timerCount = 0; Timer { id: onesecondtimer interval: 1000 running: true repeat: true triggeredOnStart: true onTriggered: { if(++timerCount > 3) timerCount=1; } 标记QtQuick标记中显示的那些项目出现在<AffectedItems>标记中。我是xslt的新手所以请告诉我这里做错了什么 这是xml:

<Changes>

以下是xslt的相关部分:

<Items>

遍历所有项目但在输出xml中没有任何项目。因此,生成的xml具有空项标记

<Product>
  <Items>
      <Item  itemIdentifier="1102607">
      </Item>
      <Item  itemIdentifier="1890456">
      </Item>
  </Items>
  <Changes>
      <Change>
        <AffectedItems>
          <AffectedItem itemIdentifier="1102607">
          </AffectedItem>
        </AffectedItems>
      </Change> 
  </Changes>
</Product>

1 个答案:

答案 0 :(得分:0)

主要问题是上下文之一。您首先在xsl:for-each元素上执行Item,该元素会将您定位到Item元素,但是您在xsl:for-each上执行Changes。这意味着它正在寻找一个元素名称Changes作为Item的子元素,但没有。因此,您的嵌套xsl:for-each应如下所示:

<xsl:for-each select="../../Changes/Change/AffectedItems/AffectedItem">

但是,此内的xsl:if仍有问题,因为您现在位于AffectedItem,而不是您所在的Item。这意味着您的xsl:if正在检查当前itemIdentifier针对后代节点的AffectedItem,从Changes开始,其中没有任何一个。

为了解决这个问题,您的xsl:for-each应该是这样的

<xsl:for-each select="Items/Item">
   <xsl:variable name="Item" select="."/>
    <xsl:for-each select="../../Changes/Change/AffectedItems/AffectedItem">
        <xsl:if test="floor(@itemIdentifier) = floor($Item/@itemIdentifier)">
            <Item>
                <xsl:value-of select="floor(@itemIdentifier)"/>
            </Item>
        </xsl:if>
    </xsl:for-each>
</xsl:for-each>

但是,这并不是一种理想的方法。这里有两件事可以让你受益。首先,是使用Identity Transform复制现有元素。其次,是使用xsl:key查找AffectedItem元素。

基本上,身份转换按原样复制所有内容,然后您只需添加一个模板以匹配没有Item的{​​{1}}元素(通过使用密钥进行检查)。

尝试这个更简单的XSLT

AffectedItem

我已删除了此示例中<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" /> <xsl:key name="Affected" match="AffectedItem" use="number(@itemIdentifier)" /> <xsl:template match="Item[not(key('Affected', number(@itemIdentifier)))]" /> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet> 的使用情况,因为我无法理解为什么要对整个数字进行整理。