3

次の XML で、XPath 式を使用して、同じコードの地域アイテムの金額が地域アイテムの金額の 5% 以内である地域アイテム要素を選択することは可能ですか? この例では、ローカル アイテム 4 が選択されます。

<?xml version="1.0" encoding="UTF-8"?>

<Inventory> 
  <Local> 
    <Item> 
      <Code>1</Code>  
      <Amount>10000</Amount> 
    </Item>  
    <Item> 
      <Code>2</Code>  
      <Amount>20000</Amount> 
    </Item>  
    <Item> 
      <Code>3</Code>  
      <Amount>30000</Amount> 
    </Item>  
    <Item> 
      <Code>4</Code>  
      <Amount>40000</Amount> 
    </Item> 
  </Local>  
  <Regional> 
    <Item> 
      <Code>2</Code>  
      <Amount>100</Amount> 
    </Item>  
    <Item> 
      <Code>4</Code>  
      <Amount>39900</Amount> 
    </Item> 
  </Regional> 
</Inventory>

これまでのところ、2 つの要素を返す以下の式で同じコードを持つローカル アイテムのみを選択できますが、「/Amount * 0.95」を追加してから、両方の要素に 0.95 を掛ける方法がわかりません。この式の最後で、最初のアイテムの金額に 0.95 を掛けた値が返されます。

/Inventory/Local/Item[Code=/Inventory/Regional/Item/Code]
4

3 に答える 3

0

目的の選択を指定するために XQuery は必要ありません

以下は、正しく、より短く、より効率的な単一の XPath 2.0 式です

for $locItem in /*/Local/*,
    $locAmount in $locItem/Amount,
    $fivePercent in $locAmount*0.05,
    $regItem in
    /*/Regional/Item
         [Code eq $locItem/Code
        and
         abs(Amount -$locAmount) le $fivePercent
         ]
 return $locItem

XSLT 2.0 - ベースの検証:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/">
  <xsl:sequence select=
   "for $locItem in /*/Local/*,
        $locAmount in $locItem/Amount,
        $fivePercent in $locAmount*0.05,
        $regItem in
        /*/Regional/Item
             [Code eq $locItem/Code
            and
             abs(Amount -$locAmount) le $fivePercent
             ]
     return $locItem"/>
 </xsl:template>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると、次のようになります。

<Inventory>
  <Local>
    <Item>
      <Code>1</Code>
      <Amount>10000</Amount>
    </Item>
    <Item>
      <Code>2</Code>
      <Amount>20000</Amount>
    </Item>
    <Item>
      <Code>3</Code>
      <Amount>30000</Amount>
    </Item>
    <Item>
      <Code>4</Code>
      <Amount>40000</Amount>
    </Item>
  </Local>
  <Regional>
    <Item>
      <Code>2</Code>
      <Amount>100</Amount>
    </Item>
    <Item>
      <Code>4</Code>
      <Amount>39900</Amount>
    </Item>
  </Regional>
</Inventory>

XPath 式が評価され、この評価の結果が出力にコピーされます。

<Item>
    <Code>4</Code>
    <Amount>40000</Amount>
</Item>
于 2013-03-15T03:46:28.880 に答える
0

私はその質問が非常に興味深いと思い、過去1時間解決しようとしていました.

XPATH 2.0を使用したソリューションは次のとおりです。

for $x  in   /Inventory/Local/Item[Code=/Inventory/Regional/Item/Code],
    $y   in   /Inventory/Regional/Item[Code = $x/code]
      return  $x[Amount div 20 <= $y/Amount ]

これは、 XPath 1.0 式を使用して行うことはできません。

于 2013-03-15T01:04:17.903 に答える
0

あなたが試すことができますxquery

XQuery

for $x in doc("input.xml")//Local/Item
let $y:=doc("input.xml")//Regional/Item[Code=$x/Code]
where $y/Amount*0.95<=$x/Amount and $x/Amount<=$y/Amount*1.05
return $x

シェルでテスト

$ zorba -q 'for $x in doc("input.xml")//Local/Item let $y:=doc("input.xml")//Regional/Item[Code=$x/Code] where $y/Amount*0.95<=$x/Amount and $x/Amount<=$y/Amount*1.05 return $x'

出力

<?xml version="1.0" encoding="UTF-8"?>
<Item> 
      <Code>4</Code>  
      <Amount>40000</Amount> 
</Item>
于 2013-03-15T01:01:58.613 に答える