检查具有特定值的子节点的最后(或第一个)节点

时间:2014-10-17 12:45:50

标签: xml json xslt

我正在使用XSLT 1.0将以下XML转换为json对象数组:

<a id="x">
    <active>Yes</active>
</a>
<a id="y">
    <active>No</active>
</a>
<a id="z">
    <active>Yes</active>
</a>

我只想使用&#34; a&#34;&#34;活跃&#34; as&#34;是&#34;。到目前为止一切顺利,我正在使用:

<xsl:if test="contains(active/node(), 'Yes')">

现在的问题是我需要在每个对象的末尾输出逗号,如下所示:

[
    {"id": "x"},
    {"id": "y"},
    {"id": "z"}
]

我可以检查节点是否是最后一个:

<xsl:if test="position()!=last()">,</xsl:if>

但如果最后一个节点有&#34;有效&#34;设置为&#34; No&#34;,前一个将输出一个逗号,因为它不是最后一个兄弟,所以我将:

[
    {"id": "x"},
    {"id": "y"},
]

这是无效的json ..有没有人知道如何解决这个问题?基本上我需要检查当前节点是否是带有子节点的最后一个节点&#34; active&#34;设置为&#34;是&#34;。或者,我可以反过来并在节点的开头输出逗号,除非这是我写的第一个节点..但是因为我无法更改变量的值(严重的是,为什么他们甚至调用这些变量在xslt?..anyway),它有点让我回到我的主要问题..

谢谢!!!

3 个答案:

答案 0 :(得分:1)

你应该在下面的语句中嵌套:

<xsl:if test="contains(active, 'Yes')">

<xsl:if test="count(preceding-sibling::a[contains(active, 'Yes')]) &gt; 0">
    <xsl:text>,</xsl:text>
</xsl:if>

渲染:

<xsl:if test="contains(active, 'Yes')">
    <xsl:if test="count(preceding-sibling::a[contains(active, 'Yes')]) &gt; 0">
        <xsl:text>,</xsl:text>
    </xsl:if>
    Do something here
</xsl:if>

答案 1 :(得分:1)

您可以查询当前元素是否包含符合条件的后续兄弟姐妹,而不是查询位置。

<xsl:if test="count(following-siblings::a[active='Yes'])">,</xsl:if>

使用相同技术的示例:

http://www.xmlplayground.com/J7BZRz

答案 2 :(得分:1)

position()last()函数不一定是指XML树中的节点位置,而是指当前节点在当前for-each选择的节点列表中的位置或apply-templates。因此,不是处理所有 a元素并使用xsl:if检查活动标记,而是可以使用apply-templates / {{的谓词进行过滤。 1}}阶段:

for-each

现在<xsl:apply-templates select="a[active[contains(., 'Yes')]]" /> position()只计算“有效”last()元素,而不是所有元素。