在php中我们确实喜欢:
$values =explode(',',"A,B,C,D");
if(in_array($value,$values)){
// Do sthing
}
我们如何在XSLT中做类似的事情。我需要从xml文件中选择所有节点,它们在$ commaSepartedString中有@x属性,它是作为参数从命令行提供的
<xsl:for-each select="table[@name in $commaSeparatedString]">
</xsl:for-each>
我可以选择通过将默认值设置为参数,例如
来包含所有节点<xsl:param name="commaSeparatedString" select="'*'"/>
所以像regx这样的东西似乎更合适
感谢
答案 0 :(得分:2)
使用XSLT 2.0我也会使用tokenize
但是使用=
进行简单比较就足够了。
<xsl:for-each select="table[@name = tokenize('A,B,C,D,E', ',')]">...</xsl:for-each>
答案 1 :(得分:1)
你应该可以这样做:
<xsl:for-each
select="table[contains(concat(',', $commaSeparatedString, ','),
concat(',', @name, ',')
)]">
</xsl:for-each>
答案 2 :(得分:1)
使用XSLT 2.0 :
table[$commaSeparatedString eq '*'
or @name = tokenize($commaSeparatedString, ',')
]
答案 3 :(得分:0)
如果您使用的是XSLT2.0,则可以使用 tokenize 功能
<xsl:variable name="tokenizedValues" select="tokenize($values,',')"/>
这会将逗号分隔的字符串拆分为值列表。然后,您可以通过选中列表中的名称属性来查找表格元素
<xsl:apply-templates select="table[index-of($tokenizedValues,@name)]"/>
例如,请考虑以下XML
<tables>
<table name="A">1</table>
<table name="B">2</table>
<table name="C">3</table>
<table name="D">4</table>
<table name="E">5</table>
</tables>
使用以下XSLT时
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/*">
<xsl:variable name="values">A,B,C,D</xsl:variable>
<xsl:variable name="tokenizedValues" select="tokenize($values,',')"/>
<xsl:apply-templates select="table[index-of($tokenizedValues,@name)]"/>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
然后输出以下内容
<table name="A">1</table>
<table name="B">2</table>
<table name="C">3</table>
<table name="D">4</table>