2009-06-18 19 views
0

抽出されるノードが無視されるように入れ子になったノードがある場合、XSLTを使用して出力するいくつかのノードを抽出します。望ましくない要素にネストされたときに望ましい要素を選択するXSLT

は考えてみましょう:

<alpha_top>This prints. 
    <beta>This doesn't. 
    <alpha_bottom>This too prints.</alpha_bottom> 
    </beta> 
</alpha_top> 

私はそれが生成する変換したい:

<alpha_top>This prints. 
    <alpha_bottom>This too prints.</alpha_bottom> 
</alpha_top> 

このanswerは、要素のタグ名の文字列の存在に基づいてノードを選択する方法を示しています。

答えて

0

[OK]を、ここでは基本的にこれは恒等変換ん良い方法

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

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

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

</xsl:stylesheet> 

ですが、あなたにはしたくない要素のために私は、XSLを削除:コピーのみにテンプレートを適用子要素

+0

ありがとう、私は朝にこれを見ます。 XSLTのリソースに関する私の質問を見ていただけますか?今、私は重く飲むつもりです。 – chernevik

0

あなたの特定のケースでは、次のスタイルシートが機能しますが、もう少し一般的なものを探していると思われます。私はまた、より簡単な方法があると確信しています。

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
    <xsl:apply-templates select="alpha_top"></xsl:apply-templates> 
</xsl:template> 

<xsl:template match="alpha_top"> 
    <xsl:copy> 
    <xsl:apply-templates select="beta/alpha_bottom|text()"></xsl:apply-templates> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*|text()"> 
    <xsl:copy> 
     <xsl:apply-templates select="*|text()"></xsl:apply-templates> 
    </xsl:copy> 
</xsl:template> 
</xsl:stylesheet> 
+0

alpha_top apply-templatesのselect文は次のように記述できます: alpha_bottomの下位要素。親要素が呼び出されているかどうかは関係ありません。 –

0

私は、いったんXSLTのトラバーサルがどのように機能するのかについて合理的な理解が得られたら、これは非常に簡単になると思います。

これを行う方法にはいくつかの選択肢があります。 Darrell Millerの答えは、ドキュメント全体を処理し、興味のない要素を取り除かなければならないことを示しています。これは1つのアプローチです。

さらに進む前に、XSLTでコンテキストの概念を完全に「取得」しないかもしれないという印象を受けます。これは重要であり、あなたの人生をよりシンプルにします。 XSLTではいつでもコンテキストノードが1つしかありません。これは現在「処理中」のノード(要素、属性、コメントなど)です。 via xsl:templateを選択すると、選択されたノードがコンテキストノードになります。だから、あなたのxml与えられた:

<alpha_top>This prints. 
    <beta>This doesn't. 
    <alpha_bottom>This too prints.</alpha_bottom> 
    </beta> 
</alpha_top> 

と、次の

<xsl:apply-templates select='beta'/> 

<xsl:template match='beta'>...</xsl:template> 

ベータノードは、テンプレート内のコンテキストノードになります。それよりももう少しですが、それほど多くはありません。

だから、あなたのようなもので、あなたのスタイルシートを起動したとき:

<xsl:template match='/'> 
    <xsl:apply-templates select='alpha_top'/> 
</xsl:apply-templates> 

あなたは(唯一の子要素がalpha_top要素である)文書ノードの子を選択しています。内部のxpathステートメントはコンテキストノードに関連しています。

ここで、その最上位テンプレートでは、alpha_bottomノードのみを処理することにします。そして、次のような声明に入れることができます:

<xsl:template match='/> 
    <xsl:apply-templates select='//alpha_top'/> 
</xsl:template> 

これはツリーを歩くと、すべてのalpha_top要素と他には何を選択することになります。

代わりにすべてのあなたの要素を処理し、単にベータノードの内容を無視することもできます

<xsl:template match='beta'> 
    <xsl:apply-templates/> 
</xsl:template> 

(私はあなたのxslに私の他の回答で述べたように:なしselect属性で、テンプレートを適用は同じですselect = '' *)を使用しています。

これはベータノードのコンテンツを無視しますが、ベータノードのすべての子プロセスを処理します(テンプレートがあると仮定します)。

したがって、出力の要素を無視することは、基本的には、選択属性で正しいxpathステートメントを使用することです。もちろん、あなたがあなたの問題におそらく最も簡単な解決策はこれで良いのXPathチュートリアル:)

0

をお勧めします:これは、あなたがあなたの例を持っている同じ空白の挙動を示さない

<xsl:template match="alpha_top|alpha_bottom"> 
    <xsl:copy> 
    <xsl:value-of select="text()" /> 
    <xsl:apply-templates /> 
    </xsl:copy> 
</xs:template> 

<xsl:template match="text()" /> 

が、これはおそらく無関係です。

+0

私はリクエストに応じてもっと説明することができてうれしく、今は時間がありません。ただ聞いてください! – Tomalak