これは二重投稿ですが、現在のタグでは作業するための返信がありませんでした. 別の投稿を更新または削除します。
私はこれを 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:...」で始まる値を持つ属性タイプがあることがわかります。