2017-12-23 9 views
1

私はxsl:for-eachを持っていて、いくつかの要素をまとめて処理しています。例えば:それはどういうわけか、私は各要素をキャッチする@testの書き方を誤解しました<otherwise> For each works, but the tests do not!の多くを出力しているためxslを使用するとXSLTが失敗するxsl:for-eachの結果をテストすることを選択する

<xsl:for-each select=".//del | .//sup | .//unc | .//gap"> 
    <xsl:choose> 
     <xsl:when test="del"><xsl:text>Output foo del</xsl:text></xsl:when> 
     <xsl:when test="sup"><xsl:text>Output foo sup</xsl:text></xsl:when> 
     <xsl:when test="unc"><xsl:text>Output foo unc</xsl:text></xsl:when> 
     <xsl:when test="gap"><xsl:text>Output foo gap</xsl:text></xsl:when> 
     <xsl:otherwise><xsl:text>For each works, but the tests do not!</xsl:text></xsl:otherwise> 
    </xsl:choose> 
<xsl:for-each> 

<xsl:for-each>は、正常に動作していますか?私はそれが現在の状況と関係していると思いますか?

ありがとうございました。

+1

あなたが必要とする何らかの理由はあります'xsl:choose/xsl:when'のノードテストをネストした' xsl:for-each'を使用して、ノードを一致するテンプレートにプッシュするのではなく、 '他の要素型については '出力foo del'などです。 –

+0

はい、これらは1つの物理セクションにまとめられ、カウントされ、脚注の番号が割り当てられます。 – idjet

答えて

1

達成したいことはわかりませんが、このように読んではいけませんか?

<xsl:for-each select=".//del | .//sup | .//unc | .//gap"> 
    <xsl:choose> 
     <xsl:when test="self::del"><xsl:text>Output foo del</xsl:text></xsl:when> 
     <xsl:when test="self::sup"><xsl:text>Output foo sup</xsl:text></xsl:when> 
     <xsl:when test="self::unc"><xsl:text>Output foo unc</xsl:text></xsl:when> 
     <xsl:when test="self::gap"><xsl:text>Output foo gap</xsl:text></xsl:when> 
     <xsl:otherwise><xsl:text>For each works, but the tests do not!</xsl:text></xsl:otherwise> 
    </xsl:choose> 
<xsl:for-each> 

また、あなたはxmlns="http://www.w3.org/1999/XSL/Transform"例えばを宣言しなければなりませんchooseまたはfor-eachの範囲内であってもよい。別の回答で提案されているようにtest="self::del"に変更

+0

申し訳ありませんが、これは私のタイプミスです - 私の実際のコードはすべての要素に 'xsl:'を持っています。上記のコードを修正しました。 '@ test'に入れたXPATHがそれぞれの要素を捕まえない理由は何ですか? – idjet

+1

'self :: del'などを試してみてください。私の答えにそれを挿入しました。さらなる質問について:より多くのサンプルXMLコード、現在の結果、および期待される結果を見ることは役立ちます。 –

+0

'self :: del'は完璧に動作しました、ありがとう! – idjet

1

は、問題を修正しますが、XSLTでこれを行うには慣用的な方法は、テンプレートルールである:

<xsl:apply-templates select=".//*" mode="m"/> 

その後、

<xsl:template match="del" mode="m">Output foo del</xsl:template> 
<xsl:template match="sup" mode="m">Output foo sup</xsl:template> 
<xsl:template match="unc" mode="m">Output foo unc</xsl:template> 
<xsl:template match="gap" mode="m">Output foo gap</xsl:template> 
<xsl:template match="*" mode="m">Otherwise</xsl:template> 
関連する問題