我有这个xml。
<?xml version="1.0" encoding="UTF-8"?>
<ns0:Messages xmlns:ns0="http://sap.com/xi/XI/SplitAndMerge">
<ns0:Message1>
<ns:sap_order_status xmlns:ns="http://orders.com">
<row>
<message_name/>
<message_num/>
<order_id/>
</row>
</ns:sap_order_status>
</ns0:Message1>
</ns0:Messages>
我需要我的xml看起来像第一个之后的第二个sap_order_status:
<?xml version="1.0" encoding="UTF-8"?>
<ns0:Messages xmlns:ns0="http://sap.com/xi/XI/SplitAndMerge">
<ns0:Message1>
<ns:sap_order_status xmlns:ns="http://orders.com">
**<sap_order_status>**
<row>
<message_name/>
<message_num/>
<order_id/>
</row>
**</sap_order_status>**
</ns:sap_order_status>
</ns0:Message1>
</ns0:Messages>
过去我曾获得过有关以前的消息的帮助,但是这一消息是如此不同,以至于我无法调整XSL。
答案 0 :(得分:0)
与上一个问题(Remove prefix from element)的唯一真正区别是您不再处理根元素,而是后代。
您只需要了解identity template,它将在将现有元素复制到您需要修改的元素之前对其进行处理。
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
然后,您将拥有一个模板,该模板与您希望向其附加新子节点的节点匹配,而不是具有与根元素匹配的模板:
<xsl:template match="ns:sap_order_status">
<xsl:copy>
<xsl:element name="{local-name()}">
<xsl:apply-templates />
</xsl:element>
</xsl:copy>
</xsl:template>
前缀ns:
将在xsl:stylesheet
元素上声明。
尝试使用此XSLT:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:ns="http://orders.com">
<xsl:output method="xml" indent="yes" />
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="ns:sap_order_status">
<xsl:copy>
<xsl:element name="{local-name()}">
<xsl:apply-templates />
</xsl:element>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>