我试图使用xQuery获取属性的确切文本。我发现的问题是我有多个具有相同名称的元素,这些元素在文本中具有带冒号的属性。
实施例
-keepattributes Signature
-keepclassmembers class com.yourapp.**{
*;
}
我使用的一些例子如下
<body>
<tag xlink:href="1.jpg" position="float" orientation="portrait"/>
<tag xlink:href="2.jpg" position="float" orientation="portrait"/>
<tag xlink:href="3.jpg" position="float" orientation="portrait"/>
<tag xlink:href="4.jpg" position="float" orientation="portrait"/>
</body>
我目前的两个例子都给出了一些输出但不是预期的结果。我正在寻找的预期输出是......
for $graphic in $body//tag
return element tag { ($graphic//@*[name()="xlink:href"]) },
element tag { $body//graphic/@*[name()="xlink:href"] }
有什么想法吗?
答案 0 :(得分:2)
对我而言,这有效:
xquery version "3.0";
declare namespace xlink = "http://xlink.im";
let $body := <body>
<tag xlink:href="1.jpg" position="float" orientation="portrait"/>
<tag xlink:href="2.jpg" position="float" orientation="portrait"/>
<tag xlink:href="3.jpg" position="float" orientation="portrait"/>
<tag xlink:href="4.jpg" position="float" orientation="portrait"/>
</body>
for $graphic in $body//tag
return $graphic/@xlink:href
只需尝试返回$graphic/@xlink:href
。
答案 1 :(得分:1)
您可以使用简单的XPath表达式返回属性:
$body//tag/@*[name()="xlink:href"]/data()
鉴于有问题的HTML代码段,上述XPath / XQuery的输出完全符合您的要求,请参阅 demo
或者,如果您的意思是以这种格式获得单个字符串值:
string-join($body//tag/@*[name()="xlink:href"], " ")
答案 2 :(得分:0)
xquery元素或QName中冒号前面的部分是命名空间。
在您的示例中,xlink将是名称空间。在示例中,XML xlink应该在XML中定义。很多时候它在根节点中定义。
如果需要xpath到具有命名空间的元素,请确保在xquery中定义命名空间并将其放在xpath中
body/tag/@xlink:href