2017-04-22 70 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

我已經對我的答案進行了編輯,將「標記」記錄考慮在內。 –