2010-12-29 5 views
2

は、私は私のコードは、以下の正しくノードを取得し、その属性属性値と一致するノードセットからノードを取得する方法はありますか?

<xsl:variable name="myXML"> 
<list> 
<input name="First" elementName="FirstName" option="one" /> 
<input name="Second" elementName="SecondName" option="Two" /> 
<input name="Third" elementName="ThirdName" option="Three" /> 
<input name="Fourth" elementName="FourthName" option="Four" /> 
</list> 
</xsl:variable> 

下のように変数に格納されたノードセットを持っています。 しかし、次のコードのfor-eachは、最後の <input>ノードに達するまで、一致を見つけた後でも繰り返されます。 ノードセットに多くの <input>ノードがある大きなリストがあると、パフォーマンス上の問題が発生する可能性があります。 私は以下のコードをもっと簡単に再因子化する必要があり、for-eachなしになる可能性があります。

<xsl:template match="/"> 
<xsl:variable name="checkName" select="'Third'" /> 
<xsl:variable name="getNode"> 
<xsl:for-each select="$myXML/list/input"> 
    <xsl:if test="./@name=$checkName"> 
    <xsl:copy-of select="." /> 
    </xsl:if> 
</xsl:for-each> 
</xsl:variable> 
<xsl:variable name="element" select="$getNode/input/@elementName" /> 
<xsl:variable name="option" select="$getNode/input/@option" /> 
<element><xsl:value-of select="$element" /></element> 
<option><xsl:value-of select="$option" /></option> 
</xsl:template> 

iは、iの入力変数checkName =「三」を持っていると私は、属性のがelementName 'とのname属性の値と一致した二つの異なる変数で「オプション」の値を必要と望んでいたすべての<input>ノード。ソリューションで私を助けてくださいまた、私はexsltやその他の拡張子を使用したくない。

+2

XSLT 1.0プロセッサ使っています:

スタイルシートは大幅にシンプルなXPathステートメントを使用するfor-each、余分な変数を除去することにより、簡素化することができますか? XSLT 1.0についての私の理解では、 'myXML'という名前の変数は結果ツリーの断片であり、for-each select =" $ myXML/list/input "を実行すると、XSLT 1.0プロセッサでエラーが発生するはずです。 –

+0

良い質問、+1。あなたの現在のコードよりはるかに短くて効率的な簡単な解決策については私の答えを見てください。 :) –

答えて

-1

checkName変数へ@nameを比較するpredicateフィルタを使用してください。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0"> 
    <xsl:variable name="myXML"> 
     <list> 
      <input name="First" elementName="FirstName" option="one" /> 
      <input name="Second" elementName="SecondName" option="Two" /> 
      <input name="Third" elementName="ThirdName" option="Three" /> 
      <input name="Fourth" elementName="FourthName" option="Four" /> 
     </list> 
    </xsl:variable> 

    <xsl:template match="/"> 
     <xsl:variable name="checkName" select="'Third'" /> 
     <element><xsl:value-of select="$myXML/list/input[@name=$checkName]/@elementName" /></element> 
     <option><xsl:value-of select="$myXML/list/input[@name=$checkName]/@option" /></option> 
    </xsl:template> 
</xsl:stylesheet> 
+0

ありがとう!両方の答えが私を助けました... – dhinu

+2

これはXSLT 1.0の解決策ではありません。 RTFで '/'演算子を使うことはできません。 –

+0

@Alejandro - はい、あなたは正しいです。私はSaxon 9.2でoXygenで動作しましたが、変数をRTFとして使用するのは標準1.0ではありません。 @dhinuはそれを使用していたので、私はそれが彼/彼女のために働くと仮定しています。 –

1

以下のコードはノードを取得し、 の属性を正しく取得しています。しかし、 のfor-eachは、 が最後のノードに到達するまで、一致を見つけた後でも を繰り返します。だから私は 多くの ノードで私のノードセットの大きなリストを持っている場合、それは パフォーマンスの問題が発生する可能性があります。私は 以下のコードをもっと簡単に再因子化する必要があり、for-eachなしで になる可能性があります。

<xsl:variable name="getNode"> 
<xsl:for-each select="$myXML/list/input"> 
    <xsl:if test="./@name=$checkName"> 
     <xsl:copy-of select="." />  
    </xsl:if> 
</xsl:for-each> 
</xsl:variable> 

使用

<xsl:variable name="getNode" select="$myXml/list/input[@name=$checkName]"/> 
関連する問題