2017-04-22 117 views
0

是否有可能编写一个模板规则,其中匹配属性使用前置兄弟运算符,排除某些类型的节点? 我试图解释我的自我。我有这样的XML输入文档:XSLT:如何计算前面的兄弟,排除某些节点类型?

<?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其前同辈排除型标签的所有节点,是vertexA焦炭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

回答

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

+0

我很抱歉,但这不是我正在寻找的,因为我想要的是前一个兄弟姐妹,除非这是一个“标签”。我编辑我的例子更清楚。即使其最前面的兄弟是“标签”,我仍然希望接收到作为输出的<顶点名称=“E”/>“。这是因为我想对最前面的兄弟不是“标签”设置约束。 – delca85

+0

我已经对我的答案进行了编辑,将“标记”记录考虑在内。 –