2

私は非常に基本的な 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ます。この 2 番目の電話番号が存在しない場合は、最初の電話番号を取得する必要があります。

4

1 に答える 1

0

これが私が持っている条件です:

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

次に、を取得する必要があり/person/phone[2]/telephonenumます。この2番目の電話番号が存在しない場合は、最初の電話番号を取得する必要があります。

私はaddresskeyあなたがただ意味していると思います(提供されたXMLには要素keyがありません)。addresskey

また、XMLは整形式ではなく、修正する必要がありました。

次に、述べられている要件に対処しましょう。

初め:

取得する必要があり/person/phone[2]/telephonenumます。

これに翻訳します:

/*/phone[2]

それで:

この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]
于 2012-01-19T06:24:44.357 に答える