是否可以编写模板规则,其中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
,其前一个兄弟排除了类型标记的所有节点,是一个vertex
,name
包含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
类型的兄弟。
答案 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
。