使用XSL

时间:2019-06-12 11:03:04

标签: xml xslt

我有这个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。

1 个答案:

答案 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>