2013-01-31 26 views
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似乎更適合

感謝

回答

1

隨着XSLT 2.0使用

table[$commaSeparatedString eq '*' 
    or @name = tokenize($commaSeparatedString, ',') 
    ] 
1

你應該能夠做到這一點:

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


</xsl:for-each> 
+0

是否有任何正則表達式e.g @name在 'A | B | C'? – sakhunzai

+1

如果您使用的是XSLT 2.0,您應該可以使用table [matches(@name,'a | b | c |')]來執行正則表達式。正則表達式在標準XSLT 1.0中不可用。 – JLRishe

0

如果您正在使用XSLT2.0,你可以利用記號化功能

<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> 
2

對於XSLT 2.0,我也會使用tokenize,但是使用=的簡單比較就足夠了,

<xsl:for-each select="table[@name = tokenize('A,B,C,D,E', ',')]">...</xsl:for-each>