我使用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>
答案 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>
的使用情况,因为我无法理解为什么要对整个数字进行整理。