匹配XSLT变量的值

时间:2014-04-24 18:21:26

标签: xml xslt

我需要测试以查看标记的值是否与我的变量匹配。我的输入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

1 个答案:

答案 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",您可以使用selectvalue-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' 比较会成功其他