我需要测试以查看标记的值是否与我的变量匹配。我的输入XML可能看起来像:
<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>
通过Eclipse XSL转换运行它,我得到以下结果:
javax.xml.transform.TransformerException: Expected ,, but found: .users
答案 0 :(得分:1)
从名为users
的{{1}}元素中提取perform
属性的正确XPath表达式
doOne
但这只适用于XSLT 2.0 - 1.0(这是$performerable/perform[@name='doOne']/@users
使用的除非你在项目中特别包含了Saxon 9)你不能使用XPath查看内容定义的变量,只有用javax.xml.transform
表达式定义的变量。包含内容的变量的值称为"result tree fragment",您可以使用select
或value-of
但不能使用XPath查看内容,如果它是正确的节点集。
当你有一个像这样的完全静态的数据时,你可以使用copy-of
函数来处理样式表本身作为另一个输入XML文档,它允许你作为一个节点访问相关的位设置而不是片段:
document
但我建议你稍微改变你的XML表示 - 如果你为每个id使用单独的元素而不是逗号分隔的列表:
<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']"/>
然后测试变得简单等于:
<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']"/>
因为如果一侧的任何节点与上的任何节点匹配,则与一侧(或两侧)上设置的节点进行$performerable/perform[@name='doOne']/u = 'user6'
比较会成功其他