入力 XML の構造は次のとおりです。
<catalog>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
<attributes>
<attribute>
<key>1</key>
<value>one</value>
</attribute>
<attribute>
<key>2</key>
<value>two</value>
</attribute>
</attributes>
</cd>
<cd>
<title>Hide your heart</title>
<artist>Bonnie Tyler</artist>
<country>UK</country>
<company>CBS Records</company>
<price>9.90</price>
<year>1988</year>
<attributes>
<attribute>
<key>1</key>
<value>one</value>
</attribute>
<attribute>
<key>2</key>
<value>two</value>
</attribute>
</attributes>
</cd>
<cd>
<title>Greatest Hits</title>
<artist>Dolly Parton</artist>
<country>USA</country>
<company>RCA</company>
<price>9.90</price>
<year>1982</year>
<attributes>
<attribute>
<key>1</key>
<value>one</value>
</attribute>
<attribute>
<key>2</key>
<value>two</value>
</attribute>
</attributes>
</cd>
<cd>
<title>Still got the blues</title>
<artist>Gary Moore</artist>
<country>UK</country>
<company>Virgin records</company>
<price>10.20</price>
<year>1990</year>
<attributes>
<attribute>
<key>1</key>
<value>WON</value>
</attribute>
<attribute>
<key>2</key>
<value>two</value>
</attribute>
</attributes>
</cd>
</catalog>
現在、{キー= 1および値= WON}(そのキーノードの兄弟である値ノード)のcdノードのみを選択して、別のxmlを作成しようとしています。複数の条件を適用しようとして、しばらくこれに固執していました。次のアプローチを試しました:
- 条件に一致するノードをコピーしてみてください
- ID コピーを実行し、条件に一致しないノードを無視する
これが実現可能かどうかわからないか、何か間違ったことをしています。私のxsltは次のようになります。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml"
indent="yes"/>
<xsl:variable name="KeyToBeMatched">1</xsl:variable>
<xsl:param name="ValueToBeMatched">WON</xsl:param>
<xsl:template match="catalog">
<xsl:for-each select="cd">
<xsl:for-each select="attributes/attribute[keu = $KeyToBeMatched]">
<xsl:variable name="attributeValue" select="value"/>
<xsl:if test="$attributeValue = $RMGAccountId">
<xsl:copy>
<xsl:apply-templates select="@*|*|text()" />
</xsl:copy>
</xsl:if>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>