2014-10-17 132 views
1

我转换下面的XML为JSON对象的数组用XSLT 1.0特定值的孩子最后一个(或第一)节点:检查是否与具有

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

我只想用“一个“的”主动“为”是“。到目前为止好,我使用的是:

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

现在的问题是,我需要输出逗号在每个月底对象,像这样:

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

我可以检查节点最后加上:

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

但是,如果最后一个节点“活动”设置为“无”,前一个将输出一个逗号,因为它不是最后一个兄弟姐妹,所以我将有:

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

这是无效的json ..有没有人有一个想法如何解决这个问题?基本上我需要检查当前节点是否是最后一个孩子“活跃”设置为“是”。另外,我可以做相反的事,并在节点的开始处输出逗号,除非这是我正在写的第一个节点..但是因为我不能更改变量的值(严重的是,为什么他们甚至称它们为变量在xslt?..anyway),它有点让我回到我的主要问题再次..

谢谢!

回答

1

position()last()功能不一定是指到节点位置的XML树内而是当前节点的列表内的位置由当前的for-eachapply-templates选择的节点。因此,而不是处理所有a元素,并用xsl:if检查活动的标志,你可以做的过滤与在apply-templates/for-each阶段谓词:

<xsl:apply-templates select="a[active[contains(., 'Yes')]]" /> 

现在position()last()只有将计“积极”a元素,而不是所有的元素。

+0

完美!谢谢你,那更好:)我实际上已经想过这样做,但不知道如何选择它,并且不知道仅涉及选定列表的那些函数 – 2014-10-17 14:21:49

1

你应该嵌套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> 

渲染:

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

嗯,谢谢,但这并不起作用,因为即使t在if中,position()将始终返回节点的实际位置,因此如果第一个节点具有“active”为“No”,则只有第二个将进入IF,但position()将是2,如果你知道我的意思吗? – 2014-10-17 12:59:03

+0

我编辑了我的答案,这次我使用'count'函数。 – 2014-10-17 13:14:15

+0

辉煌!那效果很好,谢谢! – 2014-10-17 13:22:32

1

而不是查询位置,你可以查询当前元素是否具有任何后续的兄弟姐妹符合您的标准。

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

实施例使用相同的技术:

http://www.xmlplayground.com/J7BZRz

+0

嗯有道理,但我得到: XSLTProcessor :: importStylesheet(): 无效的表达式 xsl:if:无法编译测试表达式'following- siblings :: a [active ='Yes']' XSLTProcessor :: transformToXml(): 没有与此对象关联的样式表 – 2014-10-17 13:20:01

+1

最终它将这个答案与下一个混合起来,如下所示: , 因为我觉得在对象末尾处理逗号更合乎逻辑。谢谢! – 2014-10-17 13:25:35