如何使用基本XPath编写“if elsif”条件?

时间:2012-01-19 05:25:27

标签: xml xpath xpathquery

我有一个非常基本的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。如果该第二个电话号码不存在则应该获得第一个电话号码。

1 个答案:

答案 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]