2017-04-22 84 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> 

我想提取所有含start的話,那不跟有相同名稱的節點,但如果start已取代endtag節點。
從我的輸入圖形,我想獲得: <tag name="A_start1"/> 我掌握的信息是,有tag元素名稱以「A_start」和「A_end」開頭,但我有這個名字後的數字沒有資料。
我想我應該使用key來做到這一點,但我不知道如何做到這一點。

+0

你的意思是要提取'A_start1'因爲它有它後面沒有'A_end1'? –

+0

@ michael.hor257k:是的,這是我想說的。 – delca85

+0

「start」之前的字符串「A_」是否已知? –

回答

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