是否有可能使用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)]的因子,这似乎是不可能的,至少我不知道如何写它。
答案 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结果集中的方式生成元素。