-3

重複の可能性:
相互に関連するノードを使用して magento XML を再構築し、トランスフォームで近づけます。

これは二重投稿ですが、現在のタグでは作業するための返信がありませんでした. 別の投稿を更新または削除します。

私はこれを Magento から取得しましたが、開発者はそれを「後」の例に簡単に変更できません。私のパーサーはこれを解析するのにいくつか問題があるので、私の質問は. これを xsl スタイルシートを使用して、nodea から nodeh までが互いに近く、より読みやすい「後」の例に変換できますか。

パーサーを調べる時間を大幅に節約できます。

前:

    <Envelope encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<Body>
    <salesOrderInfoResponse>
        <result type="ns1:salesOrderEntity">
            <nodec>value</nodec>
            <noded>value</noded>
            <shipping_address type="ns1:salesOrderAddressEntity">
                <parent_id type="xsd:string">762</parent_id>
                <address_type type="xsd:string">shipping</address_type>
                <firstname type="xsd:string">K</firstname>
                <lastname type="xsd:string">Jansen</lastname>
            </shipping_address>
            <billing_address type="ns1:salesOrderAddressEntity">
                <parent_id type="xsd:string">762</parent_id>
                <address_type type="xsd:string">billing</address_type>
                <firstname type="xsd:string">K</firstname>
                <lastname type="xsd:string">Jansen</lastname>
            </billing_address>
            <items arrayType="ns1:salesOrderItemEntity[4]" type="ns1:salesOrderItemEntityArray">
                <item type="ns1:salesOrderItemEntity">
                    <item_id type="xsd:string">3105</item_id>
                </item>
                <item type="ns1:salesOrderItemEntity">
                    <item_id type="xsd:string">3106</item_id>
                </item>
                <item type="ns1:salesOrderItemEntity">
                    <item_id type="xsd:string">3107</item_id>
                </item>
                <item type="ns1:salesOrderItemEntity">
                    <item_id type="xsd:string">3108</item_id>
                </item>
            </items>
            <payment type="ns1:salesOrderPaymentEntity">
                <parent_id type="xsd:string">762</parent_id>
                <cc_last4 type="xsd:string"></cc_last4>
            </payment>
            <nodea>value</nodea>
            <nodeb>value</nodeb>
            <nodee>value</nodee>
            <nodef>value</nodef>
            <nodeg>value</nodeg>
            <nodeh>value</nodeh>
        </result>
    </salesOrderInfoResponse>
</Body>

後:

<Envelope encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<Body>
    <salesOrderInfoResponse>
        <result type="ns1:salesOrderEntity">
            <nodea>value</nodea>
            <nodeb>value</nodeb>
            <nodec>value</nodec>
            <noded>value</noded>
            <nodee>value</nodee>
            <nodef>value</nodef>
            <nodeg>value</nodeg>
            <nodeh>value</nodeh>
            <shipping_address type="ns1:salesOrderAddressEntity">
                <parent_id type="xsd:string">762</parent_id>
                <address_type type="xsd:string">shipping</address_type>
                <firstname type="xsd:string">K</firstname>
                <lastname type="xsd:string">Jansen</lastname>
            </shipping_address>
            <billing_address type="ns1:salesOrderAddressEntity">
                <parent_id type="xsd:string">762</parent_id>
                <address_type type="xsd:string">billing</address_type>
                <firstname type="xsd:string">K</firstname>
                <lastname type="xsd:string">Jansen</lastname>
            </billing_address>
            <items arrayType="ns1:salesOrderItemEntity[4]" type="ns1:salesOrderItemEntityArray">
                <item type="ns1:salesOrderItemEntity">
                    <item_id type="xsd:string">3105</item_id>
                </item>
                <item type="ns1:salesOrderItemEntity">
                    <item_id type="xsd:string">3106</item_id>
                </item>
                <item type="ns1:salesOrderItemEntity">
                    <item_id type="xsd:string">3107</item_id>
                </item>
                <item type="ns1:salesOrderItemEntity">
                    <item_id type="xsd:string">3108</item_id>
                </item>
            </items>
            <payment type="ns1:salesOrderPaymentEntity">
                <parent_id type="xsd:string">762</parent_id>
                <cc_last4 type="xsd:string"></cc_last4>
            </payment>
        </result>
    </salesOrderInfoResponse>
</Body>

私はxsltの提案を追加し、それを少し修正しました.それは継ぎ目です:

<xsl:template match="@*|node()"> 
    <xsl:copy> 
        <xsl:apply-templates select="@*|node()" /> 
    </xsl:copy> 
</xsl:template> 


<xsl:template match="result"> 
    <xsl:copy> 
        <xsl:apply-templates select="@*" /> 
        <xsl:apply-templates select="*[    starts-with(local-name(),'node') ]" /> 
        <xsl:apply-templates select="*[not(starts-with(local-name(),'node'))]|processing-instruction()|comment()" /> 
    </xsl:copy> 
</xsl:template> 

私は持っていることを知っています:

  <salesOrderInfoResponse> 

     <result type="ns1:salesOrderEntity">
        <nodec>value</nodec>
        <noded>value</noded>
        <nodea>value</nodea>
        <nodeb>value</nodeb>
        <nodee>value</nodee>
        <nodef>value</nodef>
        <nodeg>value</nodeg>
        <nodeh>value</nodeh>
        <shipping_address type="ns1:salesOrderAddressEntity"> 

           <parent_id type="xsd:string">762</parent_id> 

           <address_type type="xsd:string">shipping</address_type> 

           <firstname type="xsd:string">K</firstname> 

           <lastname type="xsd:string">Jansen</lastname> 

        </shipping_address>
        <billing_address type="ns1:salesOrderAddressEntity"> 

           <parent_id type="xsd:string">762</parent_id> 

           <address_type type="xsd:string">billing</address_type> 

           <firstname type="xsd:string">K</firstname> 

           <lastname type="xsd:string">Jansen</lastname> 

        </billing_address>
        <items arrayType="ns1:salesOrderItemEntity[4]" type="ns1:salesOrderItemEntityArray"> 

           <item type="ns1:salesOrderItemEntity"> 

              <item_id type="xsd:string">3105</item_id> 

           </item> 

           <item type="ns1:salesOrderItemEntity"> 

              <item_id type="xsd:string">3106</item_id> 

           </item> 

           <item type="ns1:salesOrderItemEntity"> 

              <item_id type="xsd:string">3107</item_id> 

           </item> 

           <item type="ns1:salesOrderItemEntity"> 

              <item_id type="xsd:string">3108</item_id> 

           </item> 

        </items>
        <payment type="ns1:salesOrderPaymentEntity"> 

           <parent_id type="xsd:string">762</parent_id> 

           <cc_last4 type="xsd:string"/> 

        </payment>
     </result> 

  </salesOrderInfoResponse> 

これはほぼ正しいです!余分な間隔がどこから来るのかわかりませんが、正しい軌道に乗っています。

実際のデータでさらにテストすると、上部にテキストノードが表示されません。上記の例ではそうでしたが、私の推測では、「ノード」コマンドが原因です。この例を作成し、テキスト ノード、nodea、nodeb などとして使用しましたが、実際のライブでは、orderid、name、quantity と呼ばれます。

子を持つ xml ノードを見ると、すべて「ns1:...」で始まる値を持つ属性タイプがあることがわかります。

4

1 に答える 1

1

この XSLT 1.0 スタイルシートを試してみてください ...

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>

<xsl:template match="@*|node()">
 <xsl:copy>
   <xsl:apply-templates select="@*|node()" />
 </xsl:copy>
</xsl:template>

<xsl:template match="result">
 <xsl:copy>
   <xsl:apply-templates select="@*" />
   <xsl:apply-templates select="*[not(starts-with(local-name(),'node'))]|processing-instruction()|comment()" />
   <xsl:apply-templates select="*[    starts-with(local-name(),'node') ]" />
 </xsl:copy>
</xsl:template>

</xsl:stylesheet>

または、テンプレートを変更することもできます...

<xsl:template match="result">
 <xsl:copy>
   <xsl:apply-templates select="@*" />
   <xsl:apply-templates select="node()">
     <xsl:sort select="starts-with(local-name(),'node') and self::*" data-type="number" />
  </xsl:apply-templates>
 </xsl:copy>
</xsl:template>

XSLT 2.0 が必要な場合は、お知らせください。XSLT 2.0 にはより適切なソリューションが用意されています。

于 2012-06-21T04:55:39.460 に答える