2017-03-24 5 views
1

XSLT 1.0では、ファンクションキー()を入力XML全体ではなく子ノード内で検索する方法はありますか。 私の入力XMLは、私が書かれているxml全体ではなく、子ノード内で検索するようにkey()を制限する方法

<a> 
    <b> 
     <c> 
      <d name="1"/> 
      <d name="2"/> 
      <d name="3"/> 
      <d name="1"/> 
     </c> 
    </b> 
    <b> 
     <c> 
      <d name="1"/> 
      <d name="2"/> 
     </c> 
    </b> 
</a> 

XSLTは、私は必要なもの

<?xml version='1.0' ?> 
<start> 
    <inside> 
     <d name="1"/> 
     <d name="1"/> 
     <d name="1"/> 
    </inside> 
    <inside> 
     <d name="1"/> 
     <d name="1"/> 
     <d name="1"/> 
    </inside> 
</start> 

になり

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

<xsl:key name="findD" match="d" use="@name"/> 

<xsl:template match="/"> 
    <start> 
     <xsl:apply-templates select="a/b/c"/> 
    </start> 
</xsl:template> 

<xsl:template match="a/b/c"> 
    <inside> 
     <xsl:for-each select="key('findD', '1')"> 
      <xsl:copy-of select="."/> 
     </xsl:for-each> 
    </inside> 
</xsl:template> 

です

のようなものです

これは、すべてのcノードの3つのノード 'd'(xmlに存在)をすべて返します。私が必要とするのは、対応するcノード(キーが呼び出されたとき)内にdノードを取得することです。

私は、ノードcの値に基づいて結果を連結できるkey()内でconcatの使用を見てきました。 XML全体ではなく、ノード内だけを見るためにkey()を言う他の方法はありますか?ここで

+0

私の例のXSLTにコピー貼り付けエラーがあります。キー機能の使用は------ --------- ------ \t \t \t ----------- – DJ1

+1

コメントにコードを投稿しないでください。 –

+0

あなたは何をしようとしているのか分かりません。一般的に、親ノードのキーを制限するには、その値を親ノードのIDと連結します。ここでの例を参照してください:http://stackoverflow.com/questions/33793795/xslt-ignore-duplicate-elements-in-シングル・ノード・アット・タイム/ 33796222#33796222 –

答えて

0

が答えです:あなたがここで鍵を使いたい理由

<xsl:key name="findD" match="d" use="generate-id(..)"/> 

<xsl:template match="/"> 
    <start> 
    <xsl:apply-templates select="a/b/c"/> 
    </start> 
</xsl:template> 

<xsl:template match="a/b/c"> 
    <xsl:variable name="parentID" select="generate-id(.)"/> 
    <inside> 
    <xsl:for-each select="key('findD', $parentID)[@name='1']"> 
     <xsl:copy-of select="."/> 
    </xsl:for-each> 
    </inside> 
</xsl:template> 

を教えてください。通常のプッシュプログラミングを使用するだけで、この問題を解決するための非常に効率的で簡単な方法になります。

<xsl:template match="/"> 
    <start> 
    <xsl:apply-templates select="a/b/c"/> 
    </start> 
</xsl:template> 

<xsl:template match="c"> 
    <inside> 
    <xsl:apply-templates select="d[@name='1']"/> 
    </inside> 
</xsl:template> 

<xsl:template match="d"> 
    <xsl:copy-of select="."/> 
</xsl:template> 
関連する問題