2016-09-20 24 views
1

ここでは、私の使用例のトーンダウン版です。私は私の変換エンジンとしてPerlでlibxsltはを使用していますexsl:node-setが属性の値を取得していません

<?xml version="1.0" encoding="utf-8"?> 
<msg> 
    <ent key="key1" type="error"> 
     <text>Error: Could not find </text> 
     <translation>Another Error similar to previous one.</translation> 
    </ent> 
    <ent key="key2" type="damage"> 
     <text>Error2: Could not find2 </text> 
     <translation>Another Error2 similar to previous one.</translation> 
    </ent> 
</msg> 

を次のように私は

変換

<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" 
    xmlns:exsl="http://exslt.org/common" extension-element-prefixes="exsl"> 

<xsl:output method="text"/> 
<xsl:template match="Message"> 
    <xsl:for-each select="ent"> 
     <xsl:variable name="current_key" select="@key"/> 
     <xsl:variable name="current_type" select="@type"/> 
     <xsl:variable name="Match" select="exsl:node-set(msg)/ent"/> 
     <xsl:copy> 
      <xsl:copy-of select="exsl:node-set($Match)/@type"/> 
      <xsl:copy-of select="exsl:node-set($Match)/@key|exsl:node-set($Match)/translation/text()"/> 
      <!--- <xsl:copy-of select="exsl:node-set($Match)/@key|exsl:node-set($Match)/translation/text()|exsl:node-set($Match)/@type"/> Trial statement --> 
     </xsl:copy> 
    </xsl:for-each> 
    <xsl:call-template name = "Me" select="$Message"/> 
</xsl:template> 
</xsl:stylesheet> 

ためのXSLファイルと入力ファイルを持っています。私の変換スクリプトは既にanswerに記載されています。スクリプトを実行するたびに、次のように出力されます。

Error: Could not find 
Another Error similar to previous one. 

Error2: Could not find2 
Another Error2 similar to previous one. 

属性typeが印刷されないのはなぜですか? exsl:node-setやその他の技術の助けを借りてそれを取得するにはどうすればよいですか?また、試し文に属性typeを出力に含めることができますか?

+0

を、何が 'はありませんあなたの入力でテンプレートが一致する「メッセージ」ノードなぜ 'exsl:node-set()'を使用しようとしているのかは、xslと入力xmlが一致していないと判断できないでしょう。 –

+0

あなたが何を言っているのか分かりません。スクリプトは正常に実行され、テンプレートが呼び出され、出力が表示されます。私は、これを除いて、最小限の、再現可能で実行可能な例を投稿する方法を知らない。 – Recker

+0

出力を生成するデフォルトテンプレートである可能性があります。入力にMessageという名前の要素がないときに、 'Message'が呼び出されるテンプレートにどのように期待しますか? - あなたの最小限の例は最小限であるかもしれませんが、それはもはや正しいものではなく、あなたの実際の問題には役に立たないかもしれません。 –

答えて

2

次のスタイルシート:

XSLT 1.0

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

<xsl:template match="/msg"> 
    <xsl:for-each select="ent"> 
     <xsl:text>KEY: </xsl:text> 
     <xsl:value-of select="@key"/> 
     <xsl:text>&#10;TYPE: </xsl:text> 
     <xsl:value-of select="@type"/> 
     <xsl:text>&#10;TEXT: </xsl:text> 
     <xsl:value-of select="text"/> 
     <xsl:text>&#10;TRANSLATION: </xsl:text> 
     <xsl:value-of select="translation"/> 
     <xsl:text>&#10;&#10;</xsl:text> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 

ご入力の例に適用した場合に、生成されます。一緒に収まらない

KEY: key1 
TYPE: error 
TEXT: Error: Could not find 
TRANSLATION: Another Error similar to previous one. 

KEY: key2 
TYPE: damage 
TEXT: Error2: Could not find2 
TRANSLATION: Another Error2 similar to previous one. 
関連する問題