我在标题中试图说的是:
考虑到一些XML我知道某个特定元素只出现一次,是否可以使用单个 XPath查询来选择包含该元素两次的节点集?
我知道有一个“联合”运算符(|),但这基本上是逻辑OR,对吧?在SQL术语中,我正在寻找相当于“union all”。
E.g。鉴于XML片段......
<toplevel>
<ElementIWant>
<SomeSubElement1>specific data</SomeSubElement1>
<SomeSubElement2>specific data 2</SomeSubElement2>
</ElementIWant>
</toplevel>
...是否有一个查询会给我一个等同于...的结果集
<ElementIWant>
...identical content...
</ElementIWant>
<ElementIWant>
...identical content...
</ElementIWant>
我没有发现任何让我觉得可以做到的事情 - 但这就是我要问的原因......
答案 0 :(得分:3)
正如其他答案所指出的,XPath无法修改XML文档并生成新节点。
由于"set"
的定义,任何节点只能参与一次节点集。
但是,XPath 2.0为我们提供了新的sequence type,,允许重复项目。
为了让一个元素在序列中出现两次,可以使用the sequence concatenation operator ","
,如下面的表达式所示:
<强> /*/ElementYouWant, /*/ElementYouWant
强>
将它放入XSLT2.0样式表中,就像这样简单:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:f="http://fxsl.sf.net/"
exclude-result-prefixes="f xs"
>
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<t>
<xsl:sequence select=
"/*/ElementYouWant, /*/ElementYouWant"/>
</t>
</xsl:template>
</xsl:stylesheet>
并在此XML文档上应用此转换:
<toplevel>
<ElementYouWant>
<SomeSubElement1>specific data</SomeSubElement1>
<SomeSubElement2>specific data 2</SomeSubElement2>
</ElementYouWant>
</toplevel>
产生想要的结果:
<t>
<ElementYouWant>
<SomeSubElement1>specific data</SomeSubElement1>
<SomeSubElement2>specific data 2</SomeSubElement2>
</ElementYouWant>
<ElementYouWant>
<SomeSubElement1>specific data</SomeSubElement1>
<SomeSubElement2>specific data 2</SomeSubElement2>
</ElementYouWant>
</t>
请注意,如果使用<xsl:sequence>
指令,则不会创建<ElementYouWant>
元素的新副本 - 因此在XSLT 2.0中,建议使用<xsl:sequence>
并避免使用<xsl:copy-of>
创建(不必要的)节点副本。
答案 1 :(得分:2)
XPath为您提供node- 集,因此根据定义,节点只出现一次。 现在,您可以使用相同的XPath命名模板并调用它两次。
<xsl:template match="/ElementIWant">
<xsl:call-template name="repeat"/>
<xsl:call-template name="repeat"/>
</xsl:template>
<xsl:template name="repeat">
<xsl:copy select=".">
<xsl:text>... same content ...</xsl:text>
</xsl:copy>
</xsl:template>
答案 2 :(得分:0)
XPath是一种用于查询XML文档中的数据的语言,而SQL UNION ALL
语法结合了来自两个不同查询的结果集。
XPath本身不能用于以与现有格式不匹配的格式显示现有数据。但是,您可以使用XSLT执行此转换:
<x:stylesheet version="1.0" xmlns:x="http://www.w3.org/1999/XSL/Transform">
<x:output method="xml"/>
<x:template match="/">
<topMostLevel>
<x:apply-templates />
</topMostLevel>
</x:template>
<x:template match="toplevel">
<x:copy-of select="."/>
<x:copy-of select="."/>
</x:template>
</x:stylesheet>