使用xslt在同一级别解析嵌套的xml

时间:2015-11-26 06:01:24

标签: xml xslt

我是XSLT转换的新手并且具有以下要求:

我有以下格式的xml

<ServiceOrder>
<Order>
<OrderNumber>1</OrderNumber>
 <OrderType>abc</OrderType>
      <Order>
      <OrderNumber>10</OrderNumber>
      <OrderType>xyz</OrderType>`enter code here`
      </Order>
</Order>
</ServiceOrder>

预期产出:

<ServiceOrder>
<Order>
 <OrderNumber>1</OrderNumber>
 <OrderType>abc</OrderType>
 </Order>
 <Order>
 <OrderNumber>10</OrderNumber>
 <OrderType>xyz</OrderType>
 </Order>
</ServiceOrder>

我需要有关如何转换同一级别的所有嵌套订单的帮助。

先谢谢。

1 个答案:

答案 0 :(得分:0)

如果您的Order元素是嵌套的,则不是选择Order的直接子元素的ServiceOrder元素,而是选择所有后代元素:

<xsl:apply-templates select=".//Order" /> 

然后你就像以前一样有一个匹配Order的模板,但它不需要包含任何选择其中Order个元素的模板。

试试这个XSTL

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

<xsl:template match="ServiceOrder">
    <xsl:copy>
        <xsl:apply-templates select=".//Order" /> 
    </xsl:copy>
</xsl:template> 

<xsl:template match="Order"> 
    <xsl:copy>
        <xsl:apply-templates select="OrderNumber" />
        <xsl:apply-templates select="OrderType" />
    </xsl:copy>
</xsl:template> 

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

或者,您可以在Order模板中使用<xsl:apply-templates select="Order" />,而不是明确选择Order元素,而是在创建元素后放置它。

尝试这个XSLT

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

<xsl:template match="Order"> 
    <xsl:copy>
        <xsl:apply-templates select="OrderNumber" />
        <xsl:apply-templates select="OrderType" />
    </xsl:copy>
    <xsl:apply-templates select="Order" /> 
</xsl:template> 

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