2011-10-28 8 views
1

特定のIDに対してすべてのノードを選択したいが、それは追加の数字で終了する可能性がある。どうやってやるの?IDで変数が終了する選択リスト

例:

<group id="list"> 
<group id="list1"> 
<group id="list2"> 
<group id="map"> 
<group id="map1"> 

宣言イム今持つ:

<xsl:variable name="rule"> 
<data> 
    <node>list</node> 
    <node>map</node> 
</data> 
</xsl:variable> 

<xsl:template match="/"> 
    <xsl:apply-templates select=".//group[ @id = exslt:node-set($rule)/data/node]"/> 
</xsl:template> 

、それは唯一の私は、 "ルール" リストに指定されたノード上で動作することができます。 [XSLT v1.0]

ご連絡ください。

+2

XSLT 1.0または2.0? –

答えて

1

I.のXSLT 1.0溶液:

この変換:このXMLドキュメントに塗布

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:param name="pIds"> 
    <id>list</id> 
    <id>map</id> 
</xsl:param> 

<xsl:variable name="vIds" select= 
    "document('')/*/xsl:param[@name='pIds']/*"/> 

<xsl:template match="group"> 
    <xsl:if test= 
    "$vIds[. = current()/@id 
     or 
     starts-with(current()/@id, .) 
     and 
     substring-after(current()/@id, .) 
     = 
     floor(substring-after(current()/@id, .)) 
     ] 
    "> 
    <!-- Processing here: --> 
    <xsl:copy-of select="."/> 
    </xsl:if> 
</xsl:template> 
</xsl:stylesheet> 

:(この例コピーで)

<t> 
<group id="list"/> 
<group id="list1"/> 
<group id="listX"/> 
<group id="list2"/> 
<group id="map"/> 
<group id="map123Z"/> 
<group id="map1"/> 
</t> 

プロセス正確に一致するノード

<group id="list"/> 
<group id="list1"/> 
<group id="list2"/> 
<group id="map"/> 
<group id="map1"/> 

説明:標準のXPath関数starts-with()substring-after()floor()

  1. 使用。

  2. 容易テストストリングが整数にキャスト可能である場合には、次のとおりfloor($s) = $s

II。 XSLT 2.0ソリューション:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 

<xsl:param name="pIds" select="'list', 'map'"/> 

<xsl:variable name="vIds" select= 
    "document('')/*/xsl:param[@name='pIds']/*"/> 

<xsl:template match= 
"group 
    [@id = $pIds 
    or 
    $pIds 
     [starts-with(current()/@id, .) 
    and 
     substring-after(current()/@id, .) 
     castable as 
     xs:integer 
     ] 
    ] 
"> 
    <!-- Processing here: --> 
    <xsl:copy-of select="."/> 
</xsl:template> 
</xsl:stylesheet> 

説明:このソリューションは、以下の主な相違点とXSLT 1.0ソリューションと非常によく似ています:XSLT 2.0で

  1. 変数/パラメータを持つことが許可されていますマッチパターンの参照。これを使用して、<xsl:if>がテンプレート本体内にあるのを防ぎます。

  2. パラメータを定義して、目的の文字列のシーケンスを含むようにします。

  3. 標準のXPath 2.0演算子castable asを使用します。

関連する問題