非常に複雑な xml ファイルを変換する一般的な XSLT を作成しようとしています。xml ファイルには、複雑なタイプの要素が多数含まれており、そのうちのいくつかは繰り返し可能です。. この単純化された例では、ルート要素「データ」には 2 つの複雑な要素 (「情報」と「連絡先」) があります。単純化された例をコピーしました。
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="MyList.xslt"?>
<data>
<Info>
<reportInfo>
<reportId>
<Number>1</Number>
</reportId>
<reportType>
<code>7</code>
<text>Main</text>
</reportType>
<product>
<code>3</code>
<text>myProduct</text>
</product>
<change>
<code>0</code>
</change>
<language>EN</language>
<Date>2013-09-25</Date>
</reportInfo>
<requestInfo>
<customerReference>sample_Reference</customerReference>
<requestType>
<code>53</code>
<text>Onlineanfrage</text>
</requestType>
<Address>
<postBox>
<postBoxNumber>1</postBoxNumber>
<postalCode>123</postalCode>
<city>abcd</city>
</postBox>
<postBox>
<postBoxNumber>2</postBoxNumber>
<postalCode>456</postalCode>
<city>efgh</city>
</postBox>
</Address>
</requestInfo>
</Info>
<contact>
<Address>
<name>
<fullname>firstname surename</fullname>
</name>
<post>
<street>mystreet</street>
<postalCode>9876</postalCode>
<city>mycity</city>
<country>
<code>110</code>
<text>mycountry</text>
</country>
</post>
<othercontacts type="PHONE">123456</othercontacts>
<othercontacts type="FAX">123457</othercontacts>
<othercontacts type="EMAIL">email@email.com</othercontacts>
</Address>
</contact>
</data>
私は次の結果を探しています (サンプルを提供しようとしました) - ( text1 ) は常にルート要素 (例: contact) の下の最初の複合要素の name() です - ( text2 ) は常に実際のノード (例: post) の親です- ( text3 ) は実際のノードの name() です (例: street / postalCode) - ( Value ) は、text3 / 実際のノードの値 (例: mystreet / 9876) です。ただし、一部のノード ( 「<strong>contact」内の othercontacts など) では、 - ( text1 )は常にルート要素 (たとえば contact) の下の最初の複合要素の name() であり、 -( text2 ) は常に実際のノードであるという要件があります。 (例: othercontract) - ( text3 ) は「タイプ」である必要があります (例: PHONE) - (Value ) は「othercontract」の値です (例: 123456)
<MyList>
<list>
<text1>info</text1>
<text2>reportId</text2>
<text3>Number</text3>
<Value>1</Value>
</list>
<list>
<text1>info</text1>
<text2>reportType</text2>
<text3>code</text3>
<Value>7</Value>
</list>
<list>
<text1>info</text1>
<text2>reportType</text2>
<text3>text</text3>
<Value>Main</Value>
</list>
..........
...........
<list>
<text1>info</text1>
<text2>postBox</text2>
<text3>postBoxNumber</text3>
<Value>1</Value>
</list>
<list>
<text1>info</text1>
<text2>postBox</text2>
<text3>postalCode</text3>
<Value>123</Value>
</list>
<list>
<text1>info</text1>
<text2>postBox</text2>
<text3>city</text3>
<Value>abcd</Value>
</list>
......
.......
<list>
<text1>contact</text1>
<text2>name</text2>
<text3>fullname</text3>
<Value>firstname surename</Value>
</list>
<list>
<text1>contact</text1>
<text2>post</text2>
<text3>street</text3>
<Value>mystreet</Value>
</list>
<list>
<text1>contact</text1>
<text2>post</text2>
<text3>postalCode</text3>
<Value>9876</Value>
</list>
<list>
<text1>contact</text1>
<text2>post</text2>
<text3>city</text3>
<Value>mycity</Value>
</list>
..........
...........
<list>
<text1>contact</text1>
<text2>othercontacts</text2>
<text3>PHONE</text3>
<Value>123456</Value>
</list>
<list>
<text1>contact</text1>
<text2>othercontacts</text2>
<text3>FAX</text3>
<Value>123457</Value>
</list>
</MyList>
私は次のことを試しましたが、いくつかの問題があります:
1)- 値を持つ要素のみが変換されるように「if」を使用して「list」の結果をフィルタリングしようとしましたが、「text3」要素と「Value」要素を含まない「list」要素も取得しています. 空のテンプレートでそれらを削除しようとしましたが、成功しませんでした。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" omit-xml-declaration="yes"/>
<xsl:template match="/">
<MyList>
</xsl:for-each>
<xsl:for-each select="//data">
<!-- selecting all nodes-->
<xsl:for-each select="descendant::node()">
<list>
<text1><xsl:value-of select="name(parent::node())"/></text1>
<text2><xsl:value-of select="local-name(parent::node()[position()])"/></text2>
<!-- tried to get only elements that does have a value of type text() -->
<xsl:if test="text() >0" >
<text3><xsl:value-of select="name(.)"/></text3>
<Value><xsl:value-of select="."/></Value>
</xsl:if>
</list>
</xsl:for-each>
</xsl:for-each>
</MyList>
</xsl:template>
<!-- tried to delete nodes that do not have element text3 -->
<xsl:template match="list[not(text3)]"/>
</xsl:stylesheet>
お返事をお待ちしております。前もって感謝します