XSLT:如何计算前一个兄弟,排除某些节点类型?

时间:2017-04-22 11:05:16

标签: xml xslt

是否可以编写模板规则,其中match属性使用previous-sibling运算符排除某些类型的节点? 我试着解释自己。我有这个xml输入文档:

<?xml version="1.0"?>
  <graph>
   <vertex name="A"/>
   <edge name="AB" />
   <tag name="tagA"/>
   <vertex name="C"/>
   <edge name="AB"/>
   <vertex name="AA"/>
   <edge name="AAD"/>
   <vertex name="D"/>
   <vertex name="AAA"/>
   <tag name="tagE"/>
   <vertex name="E"/>
  </graph>

我想要提取的是vertex,其前一个兄弟排除了类型标记的所有节点,是一个vertexname包含A个字符。在这种情况下,我想要的输出是:     <vertex name="E"/>

我不知道应该编写哪个template规则,因为我知道如何为给定类型的第一个前一个兄弟设置约束:

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:exsl="http://exslt.org/common"
  exclude-result-prefixes="exsl">
  <xsl:template match="vertex[preceding-sibling::vertex[1]
    [self::vertex[contains(@name, 'A')]]]">
  <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>


我能够为节点的第一个preceding-sibling写一个匹配项,而不指定任何类型,但在这种情况下它对我没有帮助。 这里的问题是我想告诉XSLT考虑所有前面的兄弟,而不是tag类型的兄弟。

1 个答案:

答案 0 :(得分:1)

我认为你想要的匹配表达是......

 <xsl:template match="vertex[preceding-sibling::*[not(self::tag)][1][self::vertex[contains(@name, 'A')]]]">

执行preceding-sibling::vertex[1]会找到当前节点之前的第一个vertex,它可能不是最紧接的兄弟节点。执行preceding-sibling::*[not(self::tag)][1]将获得不是tag的最重要的兄弟姐妹,然后您可以将其检查为vertex