Пользовательское разделение XML с использованием XSLT - PullRequest
0 голосов
/ 03 мая 2018

У меня есть XML-структура, показанная ниже, как часть шага инструмента отображения.

<?xml version="1.0" encoding="UTF-8"?>
<multimap:Messages xmlns:multimap="http://google.com/z/Z/SplitAndMerge">
  <multimap:Message1>
    <Response>
      <Employment><status>OK</status></Employment>
    </Responses>
    <Responses>
      <Term><status>OK</status></Term>
    </Responses>
  </multimap:Message1>
</multimap:Messages>

Мне нужно разделить каждый ответ на отдельные номера сообщений, как показано ниже.

<?xml version="1.0" encoding="UTF-8"?>
<multimap:Messages xmlns:multimap="http://google.com/z/Z/SplitAndMerge">
  <multimap:Message1>
    <Response>
      <Employment><status>OK</status></Employment>
    </Responses>
  </multimap:Message1>
  <multimap:Message2>
    <Responses>
      <Term><status>OK</status></Term>
    </Responses>
  </multimap:Message2>
</multimap:Messages>

Есть ли способ добиться этого с помощью XSLT?

Ответы [ 2 ]

0 голосов
/ 04 мая 2018
<xsl:template match="multimap:Messages">
        <xsl:element name="multimap:Messages">
        <xsl:for-each select="multimap:Message1/Responses">
            <xsl:element name="{concat('multimap:Message',position())}">
                <xsl:copy-of select="."/>
            </xsl:element>
        </xsl:for-each>
        </xsl:element>
    </xsl:template>
0 голосов
/ 03 мая 2018

Вы можете обработать каждый Response (или Responses, ваш образец не соответствует) и обернуть его в элемент сообщения:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="3.0">

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/*">
      <xsl:copy>
          <xsl:apply-templates select="*/Response"/>
      </xsl:copy>
  </xsl:template>

  <xsl:template match="Response">
      <xsl:element name="multimap:Message{position()}" xmlns:multimap="http://google.com/z/Z/SplitAndMerge">
          <xsl:copy-of select="."/>
      </xsl:element>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty -development.net / 94hvTyY

Это XSLT 3, если вы используете процессор XSLT 2, вам нужно заменить <xsl:mode on-no-match="shallow-copy"/> на шаблон преобразования идентификаторов

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