2011-08-10 6 views
4

私は、この入力があります。for-each以外の現在のノードを変更するXSLT命令は何ですか?

A:ここで

F1A1 (4) 
F1A2 (4) 
F1A3 (4) 
F2A1 (4) 
F2A2 (4) 
F2A3 (4) 
F3A1 (4) 
F3A2 (4) 
F3A3 (4) 

が要件です:

<school> 
    <faculty> 
     <area> 
      <name>F1A1</name> 
     </area> 
     <area> 
      <name>F1A2</name> 
     </area> 
     <area> 
      <name>F1A3</name> 
     </area> 
    </faculty> 
    <faculty> 
     <area> 
      <name>F2A1</name> 
     </area> 
     <area> 
      <name>F2A2</name> 
     </area> 
     <area> 
      <name>F2A3</name> 
     </area> 
    </faculty> 
    <faculty> 
     <area> 
      <name>F3A1</name> 
     </area> 
     <area> 
      <name>F3A2</name> 
     </area> 
     <area> 
      <name>F3A3</name> 
     </area> 
    </faculty> 
</school> 

を、私は、この出力を取得したい(括弧内の数字は、文字列の長さです)最初の試合は<xsl:template match="/">でなければなりません。

B.テンプレートT1は、例えば次のように定義される。

<xsl:template name="T1"> 

    <xsl:value-of select="concat(.,' (',string-length(.),')&#10;')"/> 

</xsl:template> 

スクリプトが必要な出力を生成するcall-template T1に必要であり、T1は、任意の方法で変更してはなりません。

C. XSLTの既定のビルトインテンプレートルールに依存する必要はありません。

これは(それは奇妙に見える)私のソリューションです:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text" indent="yes"/> 
    <xsl:template match="/"> 
     <xsl:for-each select="school/faculty"> 
      <xsl:for-each select="area"> 
       <xsl:for-each select="name"> 
        <xsl:call-template name="T1"/> 
       </xsl:for-each> 
      </xsl:for-each> 
     </xsl:for-each> 
    </xsl:template> 
    <xsl:template name="T1"> 
     <xsl:value-of select="concat(.,' (',string-length(.),')&#10;')"/> 
    </xsl:template> 
</xsl:stylesheet> 

1部には、私は私がselectcall-templateながら操作を行うことができないので、単純に、namecurrent nodeを変更する<xsl:for-each select="name">を使用しています。まあ私は知っているので、誰もがcall-templateを避けてapply-templateを選ぶので、この方法でコードを書く人はいませんが、私はこの問題を解決しようとしています。

だから、基本的に私の質問は、他のXSLT命令は現在のノードを変更することができます<xsl:for-each select="name">以外のでしょうか?

ボーナスの質問:私はそれをやっている方法の他に問題を解決する別の方法はありますか? (もちろん3つのルールを尊重しながら)

+1

__The現在のノードが常に現在のノードリストのメンバーです。 XSLTの多くの操作は、現在のノードに関連しています。現在のノードリストまたは現在のノードを変更する命令はほんのわずかです([5テンプレートルール]および[8繰り返し]を参照)。__ W3C XSLT 1.0 Recc - はじめに –

+0

'current()'関数について考えると、 'xsl:for-each'、' xsl:for-each-group'、 'xsl:template'、' xsl:analyze-string'は現在のノードを実際に変更します。しかし、どのように 'xsl:key'を追加しますか? –

+0

@empo heysは編集を見ます – Pacerier

答えて

1

答えはコメントごとです。必要な指示はxsl:template(それに応じてテンプレートを適用することによって呼び出されます)です。

は例えば、以下のスタイルシートは、あなたと同じ結果を生成します。

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text" indent="yes"/> 

    <xsl:template match="/"> 
     <xsl:apply-templates select="school/faculty/area/name"/> 
    </xsl:template> 

    <xsl:template match="name"> 
     <xsl:call-template name="T1"/> 
    </xsl:template> 

    <xsl:template name="T1"> 
     <xsl:value-of select="concat(.,' (',string-length(.),')&#10;')"/> 
    </xsl:template> 

</xsl:stylesheet> 
関連する問題