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