次のXMLデータセット/ XML構造のノード要素をアセンブルするための2つの「forループ」よりも優れた方法はありますか?
<?xml version="1.0" encoding="UTF-8"?>
<root>
<nodeA>
<nodeAa>
<Row>
<ID>100001</ID>
<NAME>ABC</NAME>
<EDV_NUMBER>900001</EDV_NUMBER>
</Row>
<Row>
<ID>100002</ID>
<NAME>DEF</NAME>
<EDV_NUMBER>900002</EDV_NUMBER>
</Row>
<Row>
<ID>700003</ID>
<NAME>XYZ</NAME>
<EDV_NUMBER>900002</EDV_NUMBER>
</Row>
</nodeAa>
</nodeA>
<nodeB>
<nodeBa>
<Row>
<EDV_NUMBER>900001</EDV_NUMBER>
<TYP>002</TYP>
<Row>
<EDV_NUMBER>900002</EDV_NUMBER>
<TYP>002</TYP>
</Row>
<Row>
<EDV_NUMBER>900002</EDV_NUMBER>
<TYP>009</TYP>
</Row>
</nodeBa>
</nodeB>
</root>
出力ファイルには、ノード「// nodeAa / Row /」の要素(IDとNAME)を含む、ノード「// nodeBa / Row / *」のすべての要素が含まれている必要があります。ここで、要素「EDV_NUMBER」は同じです。
<?xml version="1.0" encoding="UTF-8"?>
<CSV>
<Row>
<EDV_NUMBER>900001</EDV_NUMBER>
<TYP>002</TYP>
<ID>100001</ID>
<NAME>ABC</NAME>
</Row>
<Row>
<EDV_NUMBER>900002</EDV_NUMBER>
<TYP>002</TYP>
<ID>100002</ID>
<NAME>DEF</NAME>
</Row>
<Row>
<EDV_NUMBER>900002</EDV_NUMBER>
<TYP>009</TYP>
<ID>700003</ID>
<NAME>XYZ</NAME>
</Row>
</CSV>
出力は次のコードで生成できますが、大きなデータセットではうまく機能しません。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" exclude-result-prefixes="#all" version="2.0">
<xsl:output method="xml" encoding="UTF-8"/>
<xsl:template match="/">
<CSV>
<xsl:for-each select="/root/nodeB/nodeBa/Row">
<xsl:variable name="FIBU" select="./EDV_NUMBER/text()"/>
<xsl:variable name="TYP" select="./TYP/text()"/>
<Row select="{position()}">
<xsl:copy-of select="./*"/>
<xsl:for-each select="/root/nodeA/nodeAa/Row">
<xsl:variable name="counter" select="position()"/>
<xsl:choose>
<xsl:when test="/root/nodeA/nodeAa/Row[$counter]/EDV_NUMMER/text()=$FIBU and $TYP='002' and /root/nodeA/nodeAa/Row[$counter]/TYP/text() < '700000'">
<xsl:copy-of select="./ID"/>
<xsl:copy-of select="./NAME"/>
</xsl:when>
<xsl:when test="/root/nodeA/nodeAa/Row[$counter]/EDV_NUMMER/text()=$FIBU and $TYP='009' and /root/nodeA/nodeAa/Row[$counter]/TYP/text() >= '700000'">
<xsl:copy-of select="./ID"/>
<xsl:copy-of select="./NAME"/>
</xsl:when>
<xsl:otherwise/>
</xsl:choose>
</xsl:for-each>
</Row>
</xsl:for-each>
</CSV>
</xsl:template>
</xsl:stylesheet>
内側のループを次のようなものに置き換えてみてください。/root/nodeA内の、外側のループの現在の要素と同じEDV_NUMBERを持つすべてのノードが選択されます。
<xsl:when test="/root/nodeA/nodeAa/Row[EDV_NUMBER=$FIBU]">
<!-- ... -->
</xsl:when>
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加