1

在 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

4 回答 4

2

使用 XSLT 2.0,我也会使用tokenize,但随后进行简单的比较=就足够了,例如

<xsl:for-each select="table[@name = tokenize('A,B,C,D,E', ',')]">...</xsl:for-each>
于 2013-01-31T12:33:46.603 回答
1

你应该能够做到这一点:

<xsl:for-each 
   select="table[contains(concat(',', $commaSeparatedString, ','), 
                          concat(',', @name, ',')
                          )]">


</xsl:for-each> 
于 2013-01-31T10:47:13.230 回答
1

使用 XSLT 2.0 使用

table[$commaSeparatedString eq '*'
     or @name = tokenize($commaSeparatedString, ',')
     ]
于 2013-02-01T03:42:52.970 回答
0

如果您使用的是 XSLT2.0,则可以使用tokenize函数

<xsl:variable name="tokenizedValues" select="tokenize($values,',')"/>

这会将逗号分隔的字符串拆分为值列表。然后,您可以通过检查列表中的name属性来查找元素

<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>
于 2013-01-31T12:00:47.030 回答