2016-12-15 7 views
0

XSLTを使用して、タグ要素をXMLファイルから探して、必要な変換を開始する必要があります。 タグ要素は、通常、ルート要素です。XSLTを使用して変数/場所を変更してXML要素を探す

<tag> 
    ... 
</tag> 

ただし、XMLファイルの新しいコレクションが到着し、そのうちのいくつかは、どこかタグ要素を持っています。 (その場所は、ファイルへのファイルによって異なります)

<a> 
    <b> 
    <tag> 
     ... 
    </tag> 
    </b> 
</a> 

は、私はその可能ならばタグのフル・パス/名を取得し、変数にそれを格納するために知っていただきたいと思いますので、私は$ tagPathを使用することができます/a/b /タグの代わりに。私はname()関数を使ってみましたが、要素名(タグ)だけを返します。

ありがとうございます!

+0

は、XPathセレクタう '//タグ' 助けを?それはファイル内の任意のレベルのタグ要素と一致し、正確なパスが時代遅れになることを知っていますか? –

+0

文書全体に「タグ」が1つしか存在しませんか?もしそうであれば、 '/ tag 'を使ってそれを選択することができます - 完全なパスを知らないで(または知る必要なしに)、 –

+0

@ michael.hor257k複数の可能性があります。そのような場合、トップレベルのもの(説明されたもの)とツリーのより深いものがあります。 – user3882500

答えて

1

上記のコメントによれば、位置に関係なくtag要素を見つけるには、\\tagを使用することができます。

この要素の完全なパスが必要な場合は、ここで提案されたソリューションを使用できます。How do you output the current element path in XSLT?

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

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

    <xsl:template match="//tag"> 
     <xsl:call-template name="genPath" /> 
    </xsl:template> 

    <xsl:template name="genPath"> 
     <xsl:param name="prevPath" /> 
     <xsl:variable name="currPath" select="concat('/',name(),'[',count(preceding-sibling::*[name() = name(current())])+1,']',$prevPath)" /> 
     <xsl:for-each select="parent::*"> 
     <xsl:call-template name="genPath"> 
      <xsl:with-param name="prevPath" select="$currPath" /> 
     </xsl:call-template> 
     </xsl:for-each> 
     <xsl:if test="not(parent::*)"> 
     <xsl:value-of select="$currPath" />  
     </xsl:if> 
    </xsl:template> 

</xsl:stylesheet> 

あなたがここにその一例を見ることができます:http://fiddle.frameless.io/

関連する問題