2010-01-29 53 views
2

鑑於以下文件:如何編寫謂詞來匹配美元符號字符?

<foo> 
    <object> 
    <property name="value"> <!-- MATCH THIS NODE --> 
     <string>alpha</string> 
    </property> 
    <property name="name"> 
     <string>$A$</string> 
    </property> 
    </object> 
    <object> 
    <property name="value"> 
     <string>bravo</string> 
    </property> 
    <property name="name"> 
     <string>$B$</string> 
    </property> 
    </object> 
</foo> 

和基於身份的樣式變換:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <!-- HAVING PROBLEMS HERE --> 
    <xsl:template match="property[@name='value'][../property[@name='name']/string='$A$']"> 
    Replace with text! 
    </xsl:template> 

</xsl:stylesheet> 

什麼謂詞我會用,如果我想,當我需要相匹配,對原有文件指出節點鍵入同級屬性/字符串元素(字符串$ A $)的內容?

回答

1

試試這個:

propery[@name='value' and ../property[@name='name' and string = '$A$']] 
+0

完美!謝謝。 – 2010-01-29 20:58:21

1

我不知道如果這是您需要足夠的通用性,但這應該讓你接近:

property[following-sibling::property[1]/string = '$A$'] 

這其中,其中一個兄弟財產有孩子財產節點匹配字符串其中文本等於「$ A $」

如果您具有兩個屬性節點的相同模板,但如果您的XML具有更多屬性節點,則需要進行調整。

+0

這適用於我的實際文檔,但還有其他元素,並且有些情況下@ name = name和@ name = value節點的順序相反。 – 2010-01-29 20:57:41

0

爲了完整起見, 「自上而下」 的XPath的緣故:

 
/foo/object[property[@name='name']='$A$']/property[@name='value'] 

雖然像下面這樣的XML結構將使更多的意義:

<foo> 
    <object> 
    <property name="$A$"> 
     <string>alpha</string> 
    </property> 
    </object> 
    <object> 
    <property name="$B$"> 
     <string>bravo</string> 
    </property> 
    </object> 
</foo> 

因爲你可以做

 
/foo/object/property[@name='$A$'] 
+0

不幸的是,我不能這樣做,因爲文檔實際上是一個持久化的Java對象(不確定實際上正在使用什麼樣的持久性框架)並且所討論的節點可能在文檔中移動(對象元素具有id或refid屬性來將對同一對象的引用鏈接在一起)。我也無法重構文檔,因爲我不控制實際使用此文檔構建安裝程序的工具集的格式。 – 2010-02-03 22:20:18