我是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>
我需要有关如何转换同一级别的所有嵌套订单的帮助。
先谢谢。
答案 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>