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