-2

非常に複雑な 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() &gt;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>

お返事をお待ちしております。前もって感謝します

4

1 に答える 1

1

これはうまくいくはずです(コメントの基準に基づいて編集されています):

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <MyList>
        <xsl:apply-templates select="//*[text()!='']"/>
    </MyList>
  </xsl:template>
  <xsl:template match="*[count(@type)=0]">
        <list>
            <xsl:variable name="p" select="count(ancestor::*)-1"/>
            <text1>
                <xsl:value-of select="name(ancestor::*[$p])"/>
            </text1>
            <text2>
                <xsl:value-of select="name(..)"/>
            </text2>
            <text3>
                <xsl:value-of select="name()"/>
            </text3>
            <Value>
                <xsl:value-of select="text()"/>
            </Value>
        </list>
  </xsl:template>
  <xsl:template match="*[count(@type)!=0]">
        <list>
            <xsl:variable name="p" select="count(ancestor::*)-1"/>
            <text1>
                <xsl:value-of select="name(ancestor::*[$p])"/>
            </text1>
            <text2>
                <xsl:value-of select="name()"/>
            </text2>
            <text3>
                <xsl:value-of select="@type"/>
            </text3>
            <Value>
                <xsl:value-of select="text()"/>
            </Value>
        </list>
  </xsl:template>
</xsl:stylesheet>

入力 XML に適用すると、次のようになります。

<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>product</text2>
        <text3>code</text3>
        <Value>3</Value>
    </list>
    <list>
        <text1>Info</text1>
        <text2>product</text2>
        <text3>text</text3>
        <Value>myProduct</Value>
    </list>
    <list>
        <text1>Info</text1>
        <text2>change</text2>
        <text3>code</text3>
        <Value>0</Value>
    </list>
    <list>
        <text1>Info</text1>
        <text2>reportInfo</text2>
        <text3>language</text3>
        <Value>EN</Value>
    </list>
    <list>
        <text1>Info</text1>
        <text2>reportInfo</text2>
        <text3>Date</text3>
        <Value>2013-09-25</Value>
    </list>
    <list>
        <text1>Info</text1>
        <text2>requestInfo</text2>
        <text3>customerReference</text3>
        <Value>sample_Reference</Value>
    </list>
    <list>
        <text1>Info</text1>
        <text2>requestType</text2>
        <text3>code</text3>
        <Value>53</Value>
    </list>
    <list>
        <text1>Info</text1>
        <text2>requestType</text2>
        <text3>text</text3>
        <Value>Onlineanfrage</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>Info</text1>
        <text2>postBox</text2>
        <text3>postBoxNumber</text3>
        <Value>2</Value>
    </list>
    <list>
        <text1>Info</text1>
        <text2>postBox</text2>
        <text3>postalCode</text3>
        <Value>456</Value>
    </list>
    <list>
        <text1>Info</text1>
        <text2>postBox</text2>
        <text3>city</text3>
        <Value>efgh</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>country</text2>
        <text3>code</text3>
        <Value>110</Value>
    </list>
    <list>
        <text1>contact</text1>
        <text2>country</text2>
        <text3>text</text3>
        <Value>mycountry</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>
    <list>
        <text1>contact</text1>
        <text2>othercontacts</text2>
        <text3>EMAIL</text3>
        <Value>email@email.com</Value>
    </list>
</MyList>
于 2013-11-15T01:37:22.127 に答える