2010-07-05 56 views
2

xpath是否可能以某種方式獲得轉換的結果,就像使用SQL可以完成的那樣?xpath是不可能的?

考慮以下幾點:

<a> 
    <b x="1" y="2" z="3"> 
    <b x="2" y="2" z="3"> 
</a> 

例如,如果我想獲得所有的B節點,但我不想在Z屬性是結果的一部分。

或者Iam想的另一件事就是接收所有y節點乘以一個類似於/ a/b [(@ y * 2)]的因子,這似乎是不可能的,至少我不知道如何寫它。

+0

不是。你究竟想達到什麼目的?你爲什麼要這樣? – Sjoerd 2010-07-05 11:12:38

+0

我只是想了解xpath的限制是什麼。 – codymanix 2010-07-05 11:20:34

+1

好問題(+1)。查看我的答案,獲得簡單而強大的XSLT解決方案。 :) – 2010-07-05 16:51:31

回答

2

不,使用XPath,只能從文檔中選擇一些節點。爲此,可以使用XQuery(它是XPath的超集)或XSLT。

1

使用xslt,您可以使用xsl:元素使用舊元素定義新元素或使用xsl:attribute添加屬性。

使用這些來從xpath結果集中以您希望的方式生成元素。

3

正如@svick的答案所指出的,XPath表達式可以從XML文檔中選擇一組節點,但它不能改變XML文檔或創建新文檔。

下面是產生其中z屬性被省略,新的XML文檔XSLT轉換,並且當所提供的XML文檔應用該轉化y屬性由2

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="node()|@*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="@z"/> 

<xsl:template match="@y"> 
    <xsl:attribute name="y"> 
    <xsl:value-of select="2* ."/> 
    </xsl:attribute> 
</xsl:template> 
</xsl:stylesheet> 

乘以(校正很好地形成於):

<a> 
    <b x="1" y="2" z="3"/> 
    <b x="2" y="2" z="3"/> 
</a> 

有用,正確的結果產生

<a> 
    <b x="1" y="4"/> 
    <b x="2" y="4"/> 
</a> 

這種解決方案的簡易性和動力是由於採用了最強大的XSLT設計模式之一:使用身份規則及其壓倒一切與特定的模板只爲必須處理節點以特定的方式。