2017-04-22 7 views
0

私は、このサンプル入力ファイルがあります。XSLT 1.0:完全に定義されていない条件に従ってノードをマッチングする方法は?

<?xml version="1.0"?> 
    <graph> 
    <tag name="A_start0"/> 
    <tag name="A_end0"/> 
    <tag name="A_start1"/> 
    <vertex name="A"/> 
    <edge name="AB" /> 
    <tag name="A_start2"/> 
    <tag name="tagA"/> 
    <vertex name="C"/> 
    <tag name="A_end2"/> 
    </graph> 

を私はstartendに置き換えられている場所と同じ名前を持つノードが続きますが、されていないstart単語を含むすべてのtagノードを抽出したいと思います。
私の入力グラフから、私が取得したいと思います: <tag name="A_start1"/> 私が持っている情報は、名前が「A_start」と「A_end」から始まりますが、私は名前を以下の数についての情報を持っていないtag要素があるということです。
これを行うにはkeyを使うべきですが、どうやってこれを行うのか分かりません。

+0

は、あなたが 'A_start1'を抽出したい意味しますかそれに続く 'A_end1'はありませんか? –

+0

@ michael.hor257k:はい、これは私が伝えたいものです。 – delca85

+0

'start 'の前の文字列' A_'は知られていますか? –

答えて

1

1つのXPath式では実行できないと思います。また、あなたがキーを使用してのあなたのアイデアで行くと何ができる

<xsl:template match="/graph"> 
    <xsl:for-each select="tag[starts-with(@name, 'A_start')] "> 
     <xsl:if test="not(following-sibling::tag[@name=concat('A_end', substring-after(current()/@name, 'A_start'))])"> 
      <xsl:copy-of select="."/> 
     </xsl:if> 
    </xsl:for-each> 
</xsl:template> 

::のようなものを試してみて、それが持っているので

<xsl:key name="end" match="tag[starts-with(@name, 'A_end')]" use="substring-after(@name, 'A_end')"/> 

<xsl:template match="/graph"> 
    <xsl:copy-of select="tag[starts-with(@name, 'A_start')][not(key('end', substring-after(@name, 'A_start')))]"/> 
</xsl:template> 
+0

私は間違った入力に取り組んでいました!あなたのソリューションは私の問題を解決しました。 – delca85

関連する問題