XSLT:如何计数先前的兄弟姐妹,不包括某些节点类型



是否可以编写一个模板规则,其中匹配属性使用先前的兄弟式操作员不包括某些类型的节点?我试图解释自己。我有此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,其先前的兄弟姐妹不包括类型标签的所有节点,是一个 vertex,其中包含 A char的 name。在这种情况下,我想要的输出是: <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

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

 <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

最新更新