我有一个非常基本的XML,并希望编写一个Xpath查询来获取值。 这是XML:
<?xml version="1.0" encoding="UTF-8"?>
<person>
<address>
<type>STD</type>
<key>1234</key>
</address>
<address>
<type>BA</type>
<key>1234</key>
</address>
<phone>
<type>TEL</type>
<key>1234</key>
<telephonenum>7</num>
</phone>
<phone>
<type>TEL</type>
<key>1234</key>
<telephonenum>8</num>
</phone>
<phone>
<type>TEL</type>
<key>1234</key>
<telephonenum>9</num>
</phone>
</person>
以下是我的条件:
If (/person/address[type = "STD"]/addresskey = and /person/address[type = "BA"/addresskey )
然后我应该得到/person/phone[2]/telephonenum
。如果该第二个电话号码不存在则应该获得第一个电话号码。
答案 0 :(得分:0)
以下是我的条件:
If (/person/address[type = "STD"]/addresskey = and /person/address[type = "BA"/addresskey )
然后我应该得到
/person/phone[2]/telephonenum
。如果这第二个 电话号码不存在那么它应该得到第一部电话 号。
我想addresskey
只表示key
(提供的XML中没有addresskey
元素。)
此外,XML格式不正确,我必须更正ie。
现在让我们解决所述要求:
首先:
我应该得到
/person/phone[2]/telephonenum
。
转换为:
/*/phone[2]
然后:
如果这一秒 电话号码不存在那么它应该得到第一部电话 号。
将上述表达式修改为:
/*/phone[not(position() >2)][last()]
最后:
If (/person/address[type = "STD"]/addresskey = and /person/address[type = "BA"/addresskey )
完整的表达式变为:
/*/phone[not(position() >2)][last()]
[/*/address[type = 'STD']/key
=
/*/address[type = 'BA']/key
]
基于XSLT的验证:
<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="/">
<xsl:copy-of select=
"/*/phone[not(position() >2)][last()]
[/*/address[type = 'STD']/key
=
/*/address[type = 'BA']/key
]
"/>
</xsl:template>
</xsl:stylesheet>
将此转换应用于提供的(并更正的)XML :
<person>
<address>
<type>STD</type>
<key>1234</key>
</address>
<address>
<type>BA</type>
<key>1234</key>
</address>
<phone>
<type>TEL</type>
<key>1234</key>
<telephonenum>7</telephonenum>
</phone>
<phone>
<type>TEL</type>
<key>1234</key>
<telephonenum>8</telephonenum>
</phone>
<phone>
<type>TEL</type>
<key>1234</key>
<telephonenum>9</telephonenum>
</phone>
</person>
选择并输出所需节点:
<phone>
<type>TEL</type>
<key>1234</key>
<telephonenum>8</telephonenum>
</phone>
<强> II。 XPath 2.0表达式:
for $check in
/*/address[type = 'STD']/key[1]
eq
/*/address[type = 'BA']/key[1],
$p1 in /*[$check]/phone[1],
$p2 in /*[$check]/phone[2]
return
($p2, $p1)[1]