2014-04-24 91 views
0

我需要测试以查看标记的值是否与我的变量匹配。我输入XML可能如下:匹配XSLT变量的值

<root> 
    <userid>user1<userid> 
    <performance> 
     <doOne> 

     </doOne> 
    </performance> 
</root> 

我已经创建了的userId的一个逗号分隔的列表中的全局变量,我需要检查该用户是否可以执行doOne,即

<xsl:variable name="performerable"> 
    <perform name="doOne" users="user3, user6, user1"/> 
    <perform name="doTwo" users="user7, user2, user6"/> 
</xsl:variable> 

然而,当我检查用户是否在任何perform的存在,我得到一个错误有以下设置:

<xsl:choose> 
    <xsl:when test="contains($performerable/perform[name='doOne'].users, 'user6')"> 
     <accepted> 
    </xsl:when> 
</xsl:choose> 

的d通过Eclipse的XSL穿越 - 运行它,我得到如下:

javax.xml.transform.TransformerException: Expected ,, but found: .users 

回答

1

正确的XPath表达式来提取具有名字doOneperform元素users属性是

$performerable/perform[@name='doOne']/@users 

但这只会在XSLT 2.0中工作 - 在1.0中(这是javax.xml.transform使用的内容,除非您的项目中特别包含了Saxon 9),您不能使用XPath查看使用内容定义的变量,只使用select表达式定义的变量。含有内容的变量的值是"result tree fragment",这是您可以采取的value-ofcopy-of,但不是您可以使用XPath查看内容的东西,如果它是适当的节点集,就可以。

当你有这样一个完全静态的数据片段时,你可以用document函数做一个技巧把样式表本身当作另一个输入XML文档来处理,它允许你将相关位作为节点集访问,而不是片段:

<xsl:variable name="performerableRtf"> 
    <perform name="doOne" users="user3, user6, user1"/> 
    <perform name="doTwo" users="user7, user2, user6"/> 
</xsl:variable> 

<xsl:variable name="performerable" select="document('')//xsl:variable[@name='performerableRtf']"/> 

但我会建议你改变你的XML表示略 - 如果你使用不同的元素每个ID,而不是一个逗号分隔的列表:

<xsl:variable name="performerableRtf"> 
    <perform name="doOne"> 
    <u>user3</u> 
    <u>user6</u> 
    <u>user1</u> 
    </perform> 
    <!-- ... --> 
</xsl:variable> 

<xsl:variable name="performerable" select="document('')//xsl:variable[@name='performerableRtf']"/> 

然后测试变得imple等于:

$performerable/perform[@name='doOne']/u = 'user6' 

由于具有在侧面上的一个(或两个)设置节点的=比较成功,如果在一侧上任何节点在其他任何节点匹配。

+0

我正在使用XSLT 1.0。那么我怎么能做到这一点,因为'xsl:when'没有'select'表达式? – Malvon

+0

@Malvon我编辑了解释'文档('')'技巧。 –