2012-01-19 41 views
2

我有一個非常基本的XML,並希望編寫一個Xpath查詢來獲取值。 這裏是XML:如何使用基本XPath編寫「if elsif」條件?

<?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

可能重複[?是否有一個 「如果 - 那麼 - 否則」 在XPath語句(http://stackoverflow.com/questions/971067/is-there-an-if - 那麼,其他語句合的XPath) –

回答

0

這裏是我具備的條件:

If (/person/address[type = "STD"]/addresskey = and /person/address[type = "BA"/addresskey) 

那麼我應該得到的/person/phone[2]/telephonenum。如果第二個 電話號碼不存在,那麼它應該獲得第一個電話號碼 。

我想通過addresskey你的意思只是key(有在所提供的XML沒有addresskey元素)。

此外,XML格式不正確,我不得不糾正即。

現在讓我們滿足規定的要求:

第一:

我應該得到的/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> 

二,的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]