XSL包含多个字符串

时间:2014-10-22 09:39:46

标签: xml xslt

如果节点包含某个字符串,我试图改变现有的测试。现在它可以对一个字符串起作用,它看起来像:

<xsl:key name="TEST" match="Parrent[contains(./Name,'Aurora') and contains(./Status,'Ongoing')]" use="Final"/>

以后用于转换Name = Aurora和Status = Ongoing的节点中的Final值。现在我有兴趣做同样的事情,但是对于我从15行中的另一个.xml文件获得的多个值看起来像这样:

Status
Ongoing
Stoped
Started
Ready
NotReady
.
.
. 

所以基本上我想和以前一样只做更多的Status类型而不是Ongoing。实现这种转变的最佳方法是什么?提前谢谢。

2 个答案:

答案 0 :(得分:0)

你真的需要contains检查还是比较平等?在后一种情况下,您可以将=运算符与节点集或节点或值序列一起使用,例如使用XSLT 2.0

Status = ('Ongoing', 'Stopped', 'Started', 'Ready', 'NotReady')

分别如果你有另一个文件中具有例如

结构的值
<status-list>
  <status>Ongoing</status>
  <status>Stopped</status>
  <status>Started</status>
  ...
</status-list>

然后你可以比较

Status = document('status-list-data.xml')/status-list/status

答案 1 :(得分:0)

您不能在<key>的匹配属性中使用变量,但可以通过谓词过滤键的结果。例如,以下表达式:

key('keyname', something)[Status=exsl:node-set($status-list)/status]

将仅选择具有子Status的节点,其值列在定义为的变量中:

<xsl:variable name="status-list">
    <status>Ongoing</status>
    <status>Stopped</status>
    <status>Started</status>
    <status>Ready</status>
    <status>NotReady</status>
</xsl:variable>

请注意,您需要声明绑定到exsl前缀的名称空间 - 请参阅: http://www.exslt.org/exsl/index.html

相关问题