我正在使用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),它有点让我回到我的主要问题..
谢谢!!!
答案 0 :(得分:1)
你应该在下面的语句中嵌套:
<xsl:if test="contains(active, 'Yes')">
与
<xsl:if test="count(preceding-sibling::a[contains(active, 'Yes')]) > 0">
<xsl:text>,</xsl:text>
</xsl:if>
渲染:
<xsl:if test="contains(active, 'Yes')">
<xsl:if test="count(preceding-sibling::a[contains(active, 'Yes')]) > 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>
使用相同技术的示例:
答案 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()
元素,而不是所有元素。