XPath関連コンポーネントでノードや要素を取得するとどのような順番になりますか?

※XPath関連コンポーネントは、ASTERIA Warp Core/Core+/Core++エディションではお使いいただけません。

ASTERIA Warp コンポーネント比較表 はこちら

 

XPathStringコンポーネントやXPathNodesetコンポーネントでは、XMLから複数のノードや要素を取得することができます。取得順序はXML内での出現順です。

XPathStringコンポーネントとXPathNodesetコンポーネントは、下記のとおり取得できる値が異なります。XPathStringコンポーネントで複数ノードがマッチするXPath式を指定しても、最初の1件のみ返されます。複数ノードを処理する場合はXPathNodesetコンポーネントをご使用ください。

コンポーネント 戻り値 用途
XPathString 最初にマッチした1件の文字列値 単一値の取得
XPathNodeset マッチした全ノード(ループ処理) 複数ノードの反復処理

例:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <name id="003">banana</name>
  <name id="001">orange</name>
  <name id="002">apple</name>
</root>

XPathStringコンポーネント

上記例のXMLに対し、XPath式に「/root/name」を指定した場合、bananaが取得できます。

XPathNodesetコンポーネント

上記例のXMLに対し、XPath式に「/root/name」を指定してループ処理した場合、以下の順で出力されます。

<name id="003">banana</name>
<name id="001">orange</name>
<name id="002">apple</name>

特定の属性値など値の順に取得したい場合

特定の属性値など値の順に取得したい場合、XSLTコンポーネントを前に配置し、xsl:sort で並び替えたXMLをXPathNodesetコンポーネントに渡すことで、XML内部の出現順を変更し、期待する順序で取得することもできます。

例えば、id属性の値の順に要素を取得したい場合、上記例のXMLでは次のようなXSLTを使います。

上記例のXMLに適用するXSLTの例:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
  <xsl:template match="/root">
    <root>
      <xsl:apply-templates select="name">
        <xsl:sort select="@id" data-type="number" order="ascending"/>
      </xsl:apply-templates>
    </root>
  </xsl:template>
  <xsl:template match="name">
    <xsl:copy>
      <xsl:copy-of select="@*"/>
      <xsl:value-of select="."/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

XSLTコンポーネントでこのXSLTを適用したXMLは下記のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <name id="001">orange</name>
  <name id="002">apple</name>
  <name id="003">banana</name>
</root>

このXMLをXPathNodesetコンポーネントの入力ストリームにし、XPath式に「/root/name」を指定してループ処理することでid属性の値の順に要素を取得できます。

<name id="001">orange</name>
<name id="002">apple</name>
<name id="003">banana</name>

 

この記事は役に立ちましたか?
5人中1人がこの記事が役に立ったと言っています

このセクションの記事

他のキーワードで検索する