XSLT を使用して XML から特定の属性名とその値を抽出する

okwaves2024-01-25  7

私は XSLT の専門家ではないので、助けが必要です。当社は、ecomm Express Logistics から AWB ステータスを取得しています。データを提供する XML 構造は、Django でシリアル化された XML 形式です。この XML から必要なデータのみを選択したいと考えています。属性名とその値を抽出しようとしましたが、望ましい出力が得られません。

以下は入力構造です

<ecomexpress-objects version="1.0">
    <object pk="1" model="awb">
    <field type="BigIntegerField" name="awb_number">700054480</field>
    <field type="CharField" name="orderid">5012</field>
    <field type="FloatField" name="actual_weight">0.5</field>
    <field type="CharField" name="origin">DELHI-DSW</field>
    <field type="CharField" name="destination">DELHI-DLN</field>
    <field type="CharField" name="customer">Ecom Express Private Limited - 32012</field>
    <field type="CharField" name="consignee">MUKESH KUMAR GUPTA</field>
    <field type="CharField" name="pickupdate">11-Feb-2013</field>
    <field type="CharField" name="status">Delivered / Closed</field>
    <field type="CharField" name="reason_code"/>
    <field type="CharField" name="reason_code_description"/>
    <field type="CharField" name="reason_code_number">999</field>
    <field type="CharField" name="receiver">mukesh 9999488339</field>
    <field type="CharField" name="expected_date">12-Feb-2013</field>
    <field type="CharField" name="last_update_date">05-Apr-2013</field>
    <field type="CharField" name="delivery_date">2013-02-17 11:26:00</field>
    <field type="CharField" name="ref_awb">None</field>
    <field type="CharField" name="rts_shipment"/>
    <field type="CharField" name="system_delivery_update">2013-02-17 11:26:00</field>
    <field type="CharField" name="rts_system_delivery_status"/>
    </object>
<object pk="2" model="awb">
    <field type="BigIntegerField" name="awb_number">700054482</field>
    <field type="CharField" name="orderid">5014</field>
    <field type="FloatField" name="actual_weight">0.5</field>
    <field type="CharField" name="origin">DELHI-DSW</field>
    <field type="CharField" name="destination">DELHI-DLN</field>
    <field type="CharField" name="customer">Ecom Express Private Limited - 32012</field>
    <field type="CharField" name="consignee">MUKESH KUMAR GUPTA</field>
    <field type="CharField" name="pickupdate">11-Feb-2013</field>
    <field type="CharField" name="status">Delivered / Closed</field>
    <field type="CharField" name="reason_code"/>
    <field type="CharField" name="reason_code_description"/>
    <field type="CharField" name="reason_code_number">999</field>
    <field type="CharField" name="receiver">mukesh 9999488339</field>
    <field type="CharField" name="expected_date">12-Feb-2013</field>
    <field type="CharField" name="last_update_date">05-Apr-2013</field>
    <field type="CharField" name="delivery_date">2013-02-17 11:26:00</field>
    <field type="CharField" name="ref_awb">None</field>
    <field type="CharField" name="rts_shipment"/>
    <field type="CharField" name="system_delivery_update">2013-02-17 11:26:00</field>
    <field type="CharField" name="rts_system_delivery_status"/>
    </object>
 </ecomexpress-objects>

期待される出力構造は次のとおりです

<ecommexpress>
<awb>
<awb_number>700054480</awb_number>
<orderid>5012</orderid>
.
.
.
.
.
</awb>
<awb>
<awb_number>700054482</awb_number>
<orderid>5014</orderid>
.
.
.
.
.
</awb>
</ecommexpress>

AWB 番号は複数回来る可能性があります。したがって、ネストされた構造が期待されます。

私のシステムでは XSLT 1.0 のみが受け入れられます。助けてください。

よろしくお願いします。

シジ・アヌプ



------------------------

使用するコードの下

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="1.0">
    
    <xsl:template match="ecomexpress-objects">
        <ecommexpress><xsl:apply-templates/></ecommexpress>
    </xsl:template>
    
    <xsl:template match="object[@model = 'awb']">
        <awb><xsl:apply-templates/></awb>
    </xsl:template>
    
    <xsl:template match="field[@name]">
        <xsl:element name="{@name}"><xsl:apply-templates/></xsl:element>
    </xsl:template>
    
</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/jxDjina で変換を参照してください

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。