これが私が持っている条件です:
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]