Добавить определенный элемент в определенном месте с XSL - PullRequest
0 голосов
/ 12 июня 2019

У меня есть этот 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 голосов
/ 12 июня 2019

Единственная реальная разница с вашим предыдущим вопросом ( Удалить префикс из элемента ) заключается в том, что вы больше не имеете дело с корневым элементом, а стали потомком.

Вам просто нужно узнать о шаблоне идентификации , который будет обрабатывать копии существующих элементов до того, как они попадут в тот, который вам нужно изменить.

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...