2012-03-29 8 views
5

XSLTのセクションを単一のノードに限定する方法があるため、ノードのパス全体が毎回必要ないのですか?例えばXSLTのセクションをシングルノードに限定する

...

Name: <xsl:value-of select="/root/item[@attrib=1]/name"/> 
Age: <xsl:value-of select="/root/item[@attrib=1]/age"/> 

これがために、各コマンドを介して行うことができますが、私は全然可能ならば、これらは避けるべきであることを信じるように導かいます...

<xsl:for-each select="/root/item[@attrib=1]"/> 
    Name: <xsl:value-of select="name"/> 
    Age: <xsl:value-of select="age"/> 
</xsl:for-each> 

私はVB.NET Withコマンドに相当するXSLTがあるかどうか尋ねていますか?

問題のXSLTファイルが大きいので、読みやすさのためにxsl:templateを避ける方がいいですが、これが唯一の方法であれば受け入れるのは喜ばしいことです。もしそうなら、特定のノードに基づいて特定のテンプレートを呼び出す構文は何ですか?

更新

では@javramによって答えにフォローアップ、特定の属性/ノードに基づく個別のテンプレートを一致させることができます。

<xsl:apply-templates select="/root/item[@attrib=1]"/> 
<xsl:apply-templates select="/root/item[@attrib=2]"/> 

<xsl:template match="/root/item[@attrib=1]"> 
    Name: <xsl:value-of select="name"/> 
    Age: <xsl:value-of select="age"/> 
</xsl:template> 

<xsl:template match="/root/item[@attrib=2]"> 
    Foo: <xsl:value-of select="foo"/> 
</xsl:template> 
+0

ここでやっているように、 'xsl:for-each'を使っても何も問題はありません。この場合、「with」のような仕方でうまく機能します。 XSLTがテンプレートを適用して一致させるなど、より適切な方法を提供するときに、明示的にループするために 'xsl:for-each'を使用することについて、人々は助言します。 –

+0

Downvoter ...私はなぜ、そしてそれほど長く後に尋ねることができますか? – freefaller

+0

Downvoter ...いいえ私はそうは思わなかった...あなたは建設的ではなく、SOの匿名性の背後に隠れている。ありがとう、ありがとう! – freefaller

答えて

2

正しい方法は、テンプレートを使用することです:

<xsl:apply-templates select="/root/item[@attrib=1]"/> 

. 
. 
. 

<xsl:template match="/root/item"> 
    Name: <xsl:value-of select="name"/> 
    Age: <xsl:value-of select="age"/> 
</xsl:template> 
+0

「With」タイプのブロックほど視覚的にはいいものではありませんが、これが正しい方法であることは間違いありません。あなたのコメントは、コメントを介して許可されていないので、あなたが@attribが変更された場合、あなたが別のテンプレートにどのように一致するかを示すのに十分親切でしょうか?私はこの要求を反映するために質問を更新します – freefaller

+0

後続の質問を無視してください、思っていたよりもずっと簡単でした。私は自分の質問を適切に更新しました – freefaller

+0

あなたのフォローアップアップデートでは、これはコード行を保存していました。属性は既に別の一致条件に含まれていたため、両方のテンプレートがまだヒットします。 – javram

2

あなたは変数を使用することがあります。

<xsl:variable name="foo" select="/root/item[@attrib=1]" /> 

<xsl:value-of select="$foo/name" /> 
<xsl:value-of select="$foo/age" /> 
+0

変数がノードを保持できるかどうか分かりませんでした。ありがとうございます。 – freefaller

0

XSLT 2.0で別の可能なスタイルがある:

<xsl:value-of select='/root/item[@attrib=1]/ 
         concat("Name: ", name, " Age: ", age)'/> 
+0

残念ながら、私たちはまだ1.0になっていますが、 "With"のカバーはあまりにも大きく、 "concat"は役に立ちません。しかし、私は入力をありがとう、ありがとう。 – freefaller

0

これは:

<xsl:for-each select="/root/item[@attrib=1]"/> 
    Name: <xsl:value-of select="name"/> 
    Age: <xsl:value-of select="age"/> 
</xsl:for-each> 

は、すべてのノード(一致するノードごとに1つずつ)に下ります。

この:

<xsl:for-each select="(/root/item[@attrib=1])[1]"/> 
    Name: <xsl:value-of select="name"/> 
    Age: <xsl:value-of select="age"/> 
</xsl:for-each> 

下り最初の(おそらく唯一の)一致するノードに、あなたが望んだとしてVB.NET With文と同じです。

関連する問題