是否可以编写一个模板规则,其中匹配属性使用先前的兄弟式操作员不包括某些类型的节点?我试图解释自己。我有此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
。