0

入力および必要な出力 xml ファイルがありますが、そのための汎用 xsl トランスフォーマーを作成できません。誰か助けてくれませんか?住所/請求には、実行時にさらに多くの要素が含まれる場合があり、メインの人物ブロックに直接コピーする必要があります。

<searchPersonResponse>
 <persons>
  <person>
   <name>name2</name>
   <address>
   <billing>
     <city>xx</city>
     <state>yyyy</state>
     <zip>zzzzz</zip>
   </billing>
   </address>
  </person>
  <person>
    <name>name1</name>
    <address>
      <billing>
       <city>xx</city>
       <state>yyyy</state>
       <zip>zzzzz</zip>
      </billing>
    </address>
   </person>
  </persons>
 </searchPersonResponse>

必要な出力 xml

<searchPersonResponse>
 <persons>
  <person>
     <name>name2</name>
     <city>xx</city>
     <state>yyyy</state>
     <zip>zzzzz</zip>
  </person>
  <person>
       <name>name1</name>
       <city>xx</city>
       <state>yyyy</state>
       <zip>zzzzz</zip>
   </person>
  </persons>
 </searchPersonResponse>
4

1 に答える 1

2

EDITED: OP は、アドレスが課金子に存在する場合にのみ、アドレスと課金要素を「アンラップ」しようとしています。XSLT はそれを行うようになりました。また、OP では XSLT 1.0 ソリューションが必要であると言及しています。XSLT 2.0 の機能は使用されていなかったので、単純にバージョンを「1.0」に変更しました。

この XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:template match="@*|node()">
        <xsl:copy>
                <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="address[child::billing]|billing[parent::address]">
        <xsl:apply-templates/>
    </xsl:template>
</xsl:stylesheet>

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

<searchPersonResponse>
    <persons>
        <person>
            <name>name2</name>
            <address>
                <billing>
                <city>xx</city>
                <state>yyyy</state>
                <zip>zzzzz</zip>
                </billing>
            </address>
        </person>
        <person>
            <name>name1</name>
            <address>
                <billing>
                <city>xx</city>
                <state>yyyy</state>
                <zip>zzzzz</zip>
                </billing>
            </address>
        </person>
    </persons>
</searchPersonResponse>

望ましい結果が得られます。

<searchPersonResponse>
    <persons>
        <person>
            <name>name2</name>
            <city>xx</city>
            <state>yyyy</state>
            <zip>zzzzz</zip>
        </person>
        <person>
            <name>name1</name>
            <city>xx</city>
            <state>yyyy</state>
            <zip>zzzzz</zip>
        </person>
    </persons>
</searchPersonResponse>

ID テンプレートは、すべてのノードと属性をコピーします。住所と請求の照合テンプレート (いずれかの要素に一致する) は、それらの子をコピーしますが、それ自体はコピーしません。

于 2013-02-15T03:51:04.410 に答える