用xpath这是不可能的吗?

时间:2010-07-05 11:06:24

标签: xml xpath

是否有可能使用xpath以某种方式转换结果,就像可以使用SQL完成一样?

鉴于以下内容:

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

例如,如果我想获得所有b节点,但我不希望z属性成为结果的一部分。

或者我想到的另一件事是接收所有y个节点乘以类似/ a / b [(@ y * 2)]的因子,这似乎是不可能的,至少我不知道如何写它。

3 个答案:

答案 0 :(得分:3)

正如@svick的回答所指出的,XPath表达式可以从XML文档中选择一组节点,但它不能改变XML文档或创建新文档。

这是一个XSLT转换,它生成一个新的XML文档,其中z属性被省略,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>

将此转换应用于提供的XML文档(更正为格式良好):

<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设计模式之一:使用标识规则及其覆盖仅针对必须在一种特定的方式。

答案 1 :(得分:2)

不,使用XPath,您只能从文档中选择一些节点。为此,您可以使用XQuery(它是XPath的超集)或XSLT。

答案 2 :(得分:1)

使用xslt,您可以使用xsl:element使用旧元素定义新元素,或使用xsl:attribute添加属性。

使用这些元素以xpath结果集中的方式生成元素。