2017-03-14 12 views
0

私は、探す項目のカンマ区切りリストであるパラメータignoreAttributesを持っています。変数copyAttribname()で正確に一致させるかどうかを同じにする必要があります。それぞれの中身を選択しますか?

xsl変数を再割り当てすることができ、手続き型言語だったら、私はこのようなものを使用したい:

<xsl:variable name="copyAttrib" select="true()"> 
<xsl:for-each select="tokenize($ignoreAttributes,',')"> 
    <xsl:if test="compare(., name()) != 0"> 
     <xsl:variable name="copyAttrib" select="false()"/> 
    </xsl:if> 
</xsl:for-each> 

xslが機能しているので、残念ながら、私は、それを行うことはできませんが(そうthis other answerは言います)。変数は一度しか割り当てられません。私は私がでtokenizefor-eachループを回避することができることを知っている(それ以外の場合は、私が尋ねることはない。)

明らか
<vsl:variable name="copyAttrib"> 
    <xsl:choose> 
     <xsl:when> 
      <xsl:for-each select="tokenize($ignoreAttributes, ',')"> 
       <xsl:if test="compare(., name()) != 0"/> 
      </xsl:for-each> 
     <xsl:otherwise> 
      <xsl:value-of select="false()"/> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 

ないまさにそれ:

私は解決策のようなものを見てと思いますignoreAttributesにreplacesを使用して,|に変更してからmatchesを使用してください。可能であれば、私はignoreAttributes(これはユーザーが提供している可能性があるためdes)には、正規表現のパターンを変更してそれらをすべてエスケープする特殊文字が含まれている可能性があります。

+1

最小限の完全なXML入力、XSLTコード、出力をご覧ください。 'tokenize'で文脈項目が文字列であるため、あなたのfor-eachのために恐れています。そうすれば、外部コンテキストノードの' name() 'は動作しません。しかし、文脈ノードの名前が '' xsl:variable name = "copyAttrib" select = "name()= tokenize($ ignoreAttribute、 '、')" /> 'を使うと、少なくとも1つのトークンに等しい。 –

+0

tokenize()を使用しているため、XSLT 2.0ソリューションを探していると仮定できますか?あなたは本当に言う必要があります(タグxslt_1.0またはxslt_2を使用します。0)質問に答える人々は多くの時間を無駄にする可能性があるからです。 –

答えて

1

私はparameterignoreAttributesを持っています。これは、カンマ区切りの検索対象リストです。変数copyAttribを、name()によって完全に一致させるかどうかと等しくなるように設定したいと思います。

<xsl:variable name="copyAttrib" as="xs:boolean" 
    select="tokenize($parameterignoreAttributes, ',') = name()"/> 

のように私に聞こえる

あなたは言う:

残念ながら、私はそれを行うことができない、XSLが機能しているので

あなたが何を意味しますか「幸いにも、XSLTは機能的なので、私はそれをする必要はありません。

+0

'='は 'contains'を意味しますか?このバージョンのXSLTはどのバージョンで動作しますか? – ArtOfWarfare

+0

XSLT/XPathを使用している場合は、本当にその質問をする必要はありません。 XPath(またはあなたが書いた他の言語)でどのように "="が動作するのかわからない場合、あなたが書いたコードはあなたに多くの驚きを与えるでしょう。はい、XPathのX = Yは、「Xのある項目はYの項目と等しい」という意味です。 –

1

これを行うためのXSLT-1.0の方法は、再帰を使用している、という名前のテンプレート:

<xsl:template name="copyAttrib"> 
    <xsl:param name="attribs" /> 
    <xsl:choose> 
     <xsl:when test="normalize-space(substring-before($attribs,',')) = normalize-space(name(.))"> 
      <xsl:value-of select="'true'" /> 
     </xsl:when> 
     <xsl:when test="normalize-space($attribs) = ''"> 
      <xsl:value-of select="'false'" /> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:call-template name="copyAttrib"> 
      <xsl:with-param name="attribs" select="substring-after($attribs,',')" /> 
      </xsl:call-template> 
     </xsl:otherwise> 
    </xsl:choose> 
    </xsl:template> 

は、現在、選択された、ノードにこのテンプレートを適用し、<xsl:variable>でラップ:

<xsl:variable name="copyAttribResult"> 
    <xsl:call-template name="copyAttrib"> 
    <xsl:with-param name="attribs" select="'a,b,c,...commaSeparatedValues...'" /> 
    </xsl:call-template> 
</xsl:variable> 

trueまたはfalseのいずれかが結果として得られます。

+0

'call-template'はXSLT-2.0では利用できませんか?私は私の文書でそれを見ない。 – ArtOfWarfare

+0

もちろん利用可能です。関数ははるかに便利なので、はるかに少ない頻度で使用されています。 –

関連する問題