2016-08-11 19 views
0

<tref>要素をドキュメント内の他のタグに置き換える必要があります。例えば、私が持っている:XSLTの要素を再帰的に置き換える

<p id="4"> 
    <cs id="56792">1090-189-01 </cs> 
    <href id="57237"> 
     <cs id="56792">Document Name</cs> 
    </href> 
</p> 

このスタイルシートの場合:次の取得

<tref id="57236"/> 

<Topic> 
    <ID>57236</ID> 
    <Text> 
     <p id="4"> 
      <cs id="56792">1090-189-01 </cs> 
      <href id="57237"> 
        <cs id="56792">Document Name</cs> 
      </href> 
     </p> 
    </Text> 
</Topic> 

は問題ではありません

<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="tref"> 
    <xsl:variable name="NodeID"><xsl:value-of select="@id"/></xsl:variable> 
    <xsl:copy-of select="//Topic[ID = $NodeID]/Text/p/node()"/> 
</xsl:template> 

私ができないことは、他のtrefsにネストされたtrefsを置き換えることです。たとえば、次の点を考慮します。

<tref id="57236"/> 

と:

<Topic> 
    <ID>57236</ID> 
    <Text> 
     <p id="251"> 
      <tref id="37287"/> 
     </p> 
    </Text> 
</Topic> 

私のスタイルシートが正式にタグの内容にTREFを置き換える - もTREFを含む:

<p id="251"> 
    <tref id="37287"/> 
</p> 

マイ現在の解決策は、2つの異なるスタイルシートから<xsl:template match="tref">を呼び出すことです。それは仕事ですが、それほどエレガントではなく、トレフがさらに深いレベルで入れ子になっているとしたらどうですか?また、再帰はXSLTのパンとバターです。

XSLTのようにすべてのtrefsを再帰的に置き換えるソリューションはありますか?

答えて

2

代わりのxsl:copy-ofを使用して、varianle

<xsl:apply-templates select="//Topic[ID = current()/@id]/Text/p/node()"/> 

の使用を排除するために、xsl:apply-templates

<xsl:apply-templates select="//Topic[ID = $NodeID]/Text/p/node()"/> 

を使用するかはあなたがルックアップするためにTopic要素をxsl:keyを利用することができます

<xsl:key name="topic" match="Topic" use="ID" /> 

次に、あなたはそれの祖先であるTopicを参照trefを持っている場合は、この

<xsl:apply-templates select="key('topic', @id)/Text/p/node()"/> 

は、無限再帰の警戒してください。

+0

ティム、ありがとうございました。 スニペット#1と#2を適用しました。 xsl:keyに慣れていないので、スニペット#3と#4について熟考しなければなりません。 –

+0

スニペット4にはマイナーなエラーがありましたが、私は今修正しました。特にXSLT 1.0でグループ化する必要がある場合は、非常に便利なコマンドであるため、xsl:keyについて学習することをお勧めします。 –

関連する問題