如何选择节点属性以逗号分隔的字符串(标记化)的所有节点

时间:2013-01-31 10:35:54

标签: xml xslt xslt-2.0

在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这样的东西似乎更合适

感谢

4 个答案:

答案 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>