2010-07-05 19 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设计模式之一:使用身份规则及其压倒一切与特定的模板只为必须处理节点以特定的方式。