2017-01-08 7 views
1

ノードを処理して、それらのノードのサブセットを再度処理したいと思います。可能な限り簡素化モード出力のXSLTテンプレートには、他のモードで一致するはずの要素が含まれています。

XML、:

<root> 
     <s> 
     </s> 
     <s> 
      <n> 
       <w a="Hello"/> 
       <n> 
        <x/> 
        <w a="he said"/> 
       </n> 
      </n> 
      <n> 
       <w a="how are you"/> 
      </n> 
     <n> 
     </n> 
     <n> 
      <w a="she answered"/> 
      <n> 
       <n> 
        <x/> 
        <w a="friendly"/> 
       </n> 
      </n> 
     </n> 
    </s> 
</root> 

私は二回、いくつかのワットのノードを処理する必要があるように、私はモードを使用することにしました。私は 'a-attribute'にマッチする2つのモード( 'fromone'、 'fromtwo'という読みやすさのために)とモードなしで空のテンプレートを追加しても同じ結果を残しています。

<xsl:template match="root/s"> 
    <output> 
     <one> 
      <xsl:apply-templates select="descendant::w"/> 
     </one> 
     <x> 
      <xsl:apply-templates select="n"/> 
     </x> 
    </output> 
</xsl:template> 

<xsl:template match="n[x]"> 
    <xsl:apply-templates select="descendant::w/@a" mode="fromtwo"/> 
</xsl:template> 

<xsl:template match="w"> 
    <xsl:apply-templates select="@a" mode="fromone"/> 
</xsl:template> 

<xsl:template match="@a" mode="fromtwo"> 
    <fromtwo> 
     <xsl:value-of select="."/> 
    </fromtwo> 
</xsl:template> 

<xsl:template match="@a" mode="fromone"> 
    <fromone> 
     <xsl:value-of select="."/> 
    </fromone> 
</xsl:template> 

は、私は、出力は次のようになりことを期待:

<root> 
    <output> 
     <one> 
     <fromone>Hello</fromone> 
     <fromone>he said</fromone> 
     <fromone>how are you</fromone> 
     <fromone>she answered</fromone> 
     <fromone>friendly</fromone> 
     </one> 
     <x> 
     <fromtwo>he said</fromtwo> 
     <fromtwo>friendly</fromtwo> 
     </x> 
    </output> 
</root> 

XSLTの関連部分は、また、オリジナルのテンプレートは、主に(モードを持つものを除く)の条件に一致し、簡素化

しかし、実際の結果では、ノードxは、私が「fromone」に、他のテンプレート・コールから来るだけ一致させると期待の要素が含まれています

<x> 
    <fromone>Hello</fromone> 
    <fromtwo>he said</fromtwo> 
    <fromone>how are you</fromone> 
    <fromone>she answered</fromone> 
    <fromtwo>friendly</fromtwo> 
    </x> 

これは私が試したすべてのXSLTプロセッサーから得た結果で、私はテンプレートの構造に誤りがあると想定しています。モードの問題で他の投稿を読んだ後でも、私は解決策に近づくことができず、XSLTのエラーを見つけることもできません。

私は何の間違いをしましたか?

なぜ結果に 'fromtwo'の出力のみを表示するのではなく、両方のテンプレートの混合出力があるのですか?

答えて

0

私はどのような誤りを犯しましたか?

あなたがない:

<x> 
     <xsl:apply-templates select="n"/> 
    </x> 

あなたがすべてn要素にテンプレートを適用しています。あなたがいる - それはw要素に到達するまで、それは再帰的に、子孫にテンプレートを適用します。すなわち

<xsl:template match="*|/"> 
    <xsl:apply-templates/> 
</xsl:template> 

n[x]を照合テンプレートにマッチしていないこれらのn要素はありませんデフォルトbuilt in templateによって処理されますカスタムテンプレートがあります。

<xsl:template match="w"> 
    <xsl:apply-templates select="@a" mode="fromone"/> 
</xsl:template> 

をなぜあなたは単に行うことはできません。

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

<xsl:template match="root"> 
    <output> 
     <one> 
      <xsl:apply-templates select=".//w"/> 
     </one> 
     <x> 
      <xsl:apply-templates select=".//n[x]//w" mode="fromtwo"/> 
     </x> 
    </output> 
</xsl:template> 

<xsl:template match="w"> 
    <fromone> 
     <xsl:value-of select="@a"/> 
    </fromone> 
</xsl:template> 

<xsl:template match="w" mode="fromtwo"> 
    <fromtwo> 
     <xsl:value-of select="@a"/> 
    </fromtwo> 
</xsl:template> 

</xsl:stylesheet> 
+0

<xsl:template match="n[not(x)]"> <xsl:apply-templates select="n"/> </xsl:template> 

は、上記のあなたのサンプルに適用すると、それは次のような出力が得られまた、空のw-matchingテンプレートを作成することでこれを解決できますか? –

+0

はい、最初からモードを一致させるとします。しかし、選択的な適用は、より簡単で効率的です。 –

0

n-要素のすべてをキャプチャするデフォルトテンプレートの問題は、x -sublementです。 sノードのコンテキストで<xsl:apply-templates select="n"/>を適用した場合、sの直接の後継者のいずれもx -subnodeを持たないので、テンプレートn[x]は決して一致しません。他のテンプレートが一致しないので、デフォルトのテンプレートが適用され、モードなしですべてのサブノードが適用されます。

は、だから私はx -subelementことなく、すべてのn -nodesの世話をするテンプレートを追加したい:だから

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 

<output xmlns="http://www.w3.org/1999/xhtml"> 
    <one/> 
    <x/> 
</output> 
<output xmlns="http://www.w3.org/1999/xhtml"> 
    <one> 
     <fromone>Hello</fromone> 
     <fromone>he said</fromone> 
     <fromone>how are you</fromone> 
     <fromone>she answered</fromone> 
     <fromone>friendly</fromone> 
    </one> 
    <x> 
     <fromtwo>he said</fromtwo> 
     <fromtwo>friendly</fromtwo> 
    </x> 
</output> 
+0

これは私の簡略化した例ですが、実際のファイルでは出力されません。のようになります。

+0

答えを編集しましたが、すべてのn [x]/w /以前のバージョンでも動作するはずだったと思います。実際のファイルを投稿してください。 –

関連する問題