如何使用 XSLT 1.0 将 XML 复杂类型元素转换为单个元素以进行 XML 转换
How do I convert an XML complextype element to individual element for XML transormation using XSLT 1.0
我下面有一个 XML 文档:
<?xml version="1.0" encoding="UTF-8"?>
<Response_Data>
<Purchase_Order>
<Purchase_Order_Data>
<Purchase_Order_ID>PURCHASE_ORDER-6-1</Purchase_Order_ID>
<Locked_in_Workday>0</Locked_in_Workday>
<Document_Number>PO-1000292</Document_Number>
<Supplier_Reference Descriptor="Cardinal Health">
<ID type="WID">777d89f438960138f522dd70ce00d3ae</ID>
<ID type="Supplier_Reference_ID">SH199</ID>
<ID type="Supplier_ID">S-1725</ID>
</Supplier_Reference>
<Document_Date>2020-03-30</Document_Date>
<Acknowledgement_Expected>0</Acknowledgement_Expected>
<Auto_Sourced>0</Auto_Sourced>
<Tax_Amount>0</Tax_Amount>
<Freight_Amount>0</Freight_Amount>
<Other_Charges>0</Other_Charges>
</Purchase_Order_Data>
</Purchase_Order>
<Purchase_Order>
<Purchase_Order_Data>
<Purchase_Order_ID>PURCHASE_ORDER-6-2</Purchase_Order_ID>
<Locked_in_Workday>0</Locked_in_Workday>
<Document_Number>PO-1000293</Document_Number>
<Supplier_Reference Descriptor="Medtronic Inc">
<ID type="WID">777d89f43896016d93c653c1ce0035f9</ID>
<ID type="Supplier_Reference_ID">SH36</ID>
<ID type="Supplier_ID">S-2935</ID>
</Supplier_Reference>
<Document_Date>2020-03-30</Document_Date>
<Acknowledgement_Expected>0</Acknowledgement_Expected>
<Auto_Sourced>0</Auto_Sourced>
<Tax_Amount>0</Tax_Amount>
<Freight_Amount>0</Freight_Amount>
<Other_Charges>0</Other_Charges>
</Purchase_Order_Data>
</Purchase_Order>
</Response_Data>
我想将其转换为:
<?xml version="1.0" encoding="UTF-8"?>
<Response_Data>
<Purchase_Order>
<Purchase_Order_Data>
<Purchase_Order_ID>PURCHASE_ORDER-6-1</Purchase_Order_ID>
<Locked_in_Workday>0</Locked_in_Workday>
<Document_Number>PO-1000292</Document_Number>
<Supplier_Reference>
<Supplier_Name>Cardinal Health</Supplier_Name>
<Supplier_ID>S-1725</Supplier_ID>
</Supplier_Reference>
<Document_Date>2020-03-30</Document_Date>
<Acknowledgement_Expected>0</Acknowledgement_Expected>
<Auto_Sourced>0</Auto_Sourced>
<Tax_Amount>0</Tax_Amount>
<Freight_Amount>0</Freight_Amount>
<Other_Charges>0</Other_Charges>
</Purchase_Order_Data>
</Purchase_Order>
<Purchase_Order>
<Purchase_Order_Data>
<Purchase_Order_ID>PURCHASE_ORDER-6-2</Purchase_Order_ID>
<Locked_in_Workday>0</Locked_in_Workday>
<Document_Number>PO-1000293</Document_Number>
<Supplier_Reference>
<Supplier_Name>Medtronic Inc</Supplier_Name>
<Supplier_ID>S-2935</Supplier_ID>
</Supplier_Reference>
<Document_Date>2020-03-30</Document_Date>
<Acknowledgement_Expected>0</Acknowledgement_Expected>
<Auto_Sourced>0</Auto_Sourced>
<Tax_Amount>0</Tax_Amount>
<Freight_Amount>0</Freight_Amount>
<Other_Charges>0</Other_Charges>
</Purchase_Order_Data>
</Purchase_Order>
</Response_Data>
以下是我使用的XSLT。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:apply-templates select="@*|node()"/>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Supplier_Reference">
<Supplier_Reference>
<Purchase_Order_ID><xsl:value-of select="../Purchase_Order_ID"/></Purchase_Order_ID>
<Supplier_ID><xsl:value-of select="ID"/></Supplier_ID>
<Supplier_Name><xsl:value-of select="../Supplier_Reference/attribute::Descriptor"/>
</Supplier_Name>
</Supplier_Reference>
</xsl:template>
</xsl:stylesheet>
我遇到的问题是输出使用第一个可用的 Supplier_Reference/ID。我想输出 "Supplier_ID" 类型的 Supplier_Reference/ID。我如何在 XSLT 文档中引用此复杂类型?
变化:
<xsl:value-of select="ID"/>
至:
<xsl:value-of select="ID[@type='Supplier_ID']"/>
请注意,您的第一个模板是多余的; built-in template rules 已经这样做了。
我下面有一个 XML 文档:
<?xml version="1.0" encoding="UTF-8"?>
<Response_Data>
<Purchase_Order>
<Purchase_Order_Data>
<Purchase_Order_ID>PURCHASE_ORDER-6-1</Purchase_Order_ID>
<Locked_in_Workday>0</Locked_in_Workday>
<Document_Number>PO-1000292</Document_Number>
<Supplier_Reference Descriptor="Cardinal Health">
<ID type="WID">777d89f438960138f522dd70ce00d3ae</ID>
<ID type="Supplier_Reference_ID">SH199</ID>
<ID type="Supplier_ID">S-1725</ID>
</Supplier_Reference>
<Document_Date>2020-03-30</Document_Date>
<Acknowledgement_Expected>0</Acknowledgement_Expected>
<Auto_Sourced>0</Auto_Sourced>
<Tax_Amount>0</Tax_Amount>
<Freight_Amount>0</Freight_Amount>
<Other_Charges>0</Other_Charges>
</Purchase_Order_Data>
</Purchase_Order>
<Purchase_Order>
<Purchase_Order_Data>
<Purchase_Order_ID>PURCHASE_ORDER-6-2</Purchase_Order_ID>
<Locked_in_Workday>0</Locked_in_Workday>
<Document_Number>PO-1000293</Document_Number>
<Supplier_Reference Descriptor="Medtronic Inc">
<ID type="WID">777d89f43896016d93c653c1ce0035f9</ID>
<ID type="Supplier_Reference_ID">SH36</ID>
<ID type="Supplier_ID">S-2935</ID>
</Supplier_Reference>
<Document_Date>2020-03-30</Document_Date>
<Acknowledgement_Expected>0</Acknowledgement_Expected>
<Auto_Sourced>0</Auto_Sourced>
<Tax_Amount>0</Tax_Amount>
<Freight_Amount>0</Freight_Amount>
<Other_Charges>0</Other_Charges>
</Purchase_Order_Data>
</Purchase_Order>
</Response_Data>
我想将其转换为:
<?xml version="1.0" encoding="UTF-8"?>
<Response_Data>
<Purchase_Order>
<Purchase_Order_Data>
<Purchase_Order_ID>PURCHASE_ORDER-6-1</Purchase_Order_ID>
<Locked_in_Workday>0</Locked_in_Workday>
<Document_Number>PO-1000292</Document_Number>
<Supplier_Reference>
<Supplier_Name>Cardinal Health</Supplier_Name>
<Supplier_ID>S-1725</Supplier_ID>
</Supplier_Reference>
<Document_Date>2020-03-30</Document_Date>
<Acknowledgement_Expected>0</Acknowledgement_Expected>
<Auto_Sourced>0</Auto_Sourced>
<Tax_Amount>0</Tax_Amount>
<Freight_Amount>0</Freight_Amount>
<Other_Charges>0</Other_Charges>
</Purchase_Order_Data>
</Purchase_Order>
<Purchase_Order>
<Purchase_Order_Data>
<Purchase_Order_ID>PURCHASE_ORDER-6-2</Purchase_Order_ID>
<Locked_in_Workday>0</Locked_in_Workday>
<Document_Number>PO-1000293</Document_Number>
<Supplier_Reference>
<Supplier_Name>Medtronic Inc</Supplier_Name>
<Supplier_ID>S-2935</Supplier_ID>
</Supplier_Reference>
<Document_Date>2020-03-30</Document_Date>
<Acknowledgement_Expected>0</Acknowledgement_Expected>
<Auto_Sourced>0</Auto_Sourced>
<Tax_Amount>0</Tax_Amount>
<Freight_Amount>0</Freight_Amount>
<Other_Charges>0</Other_Charges>
</Purchase_Order_Data>
</Purchase_Order>
</Response_Data>
以下是我使用的XSLT。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<xsl:apply-templates select="@*|node()"/>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Supplier_Reference">
<Supplier_Reference>
<Purchase_Order_ID><xsl:value-of select="../Purchase_Order_ID"/></Purchase_Order_ID>
<Supplier_ID><xsl:value-of select="ID"/></Supplier_ID>
<Supplier_Name><xsl:value-of select="../Supplier_Reference/attribute::Descriptor"/>
</Supplier_Name>
</Supplier_Reference>
</xsl:template>
</xsl:stylesheet>
我遇到的问题是输出使用第一个可用的 Supplier_Reference/ID。我想输出 "Supplier_ID" 类型的 Supplier_Reference/ID。我如何在 XSLT 文档中引用此复杂类型?
变化:
<xsl:value-of select="ID"/>
至:
<xsl:value-of select="ID[@type='Supplier_ID']"/>
请注意,您的第一个模板是多余的; built-in template rules 已经这样做了。