Объединение узлов XML в один узел с помощью XSLT - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь отредактировать некоторый XML с помощью преобразования, но я изо всех сил пытаюсь достичь желаемых результатов.

У меня есть XML:

<FX>
   <Order ATTRIBUTE1="ACTIVE" ATTRIBUTE2="CCY" />
   <Attribute NAME="N1" VALUE="V1" />
   <Attribute NAME="N2" VALUE="V2" />
   <Attribute NAME="N3" VALUE="V3" />
</FX>

И я хочу преобразовать его так:

<FX>
   <Order ATTRIBUTE1="ACTIVE" ATTRIBUTE2="CCY" />
   <Attribute NAME="N1, N2, N3" VALUE="V1,V2,V3" />
</FX>

Возможно ли это? Может кто-нибудь предложить какие-либо предложения о том, как сделать это с помощью преобразования?

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

В общем, если вы хотите преобразовать некоторые узлы, но оставить остальные, вы используете шаблон преобразования идентификаторов в качестве отправной точки, а затем добавляете шаблоны, которые изменяют те узлы, которые вы хотите изменить:

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

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

  <xsl:template match="FX/Attribute[1]">
      <xsl:copy>
          <xsl:apply-templates select="@*"/>
      </xsl:copy>
  </xsl:template>

  <xsl:template match="FX/Attribute[position() > 1]"/>

  <xsl:template match="FX/Attribute[1]/@*">
      <xsl:attribute name="{name()}">
          <xsl:for-each select=". | ../following-sibling::Attribute/@*[name() = name(current())]">
              <xsl:if test="position() > 1">,</xsl:if>
              <xsl:value-of select="."/>
          </xsl:for-each>
      </xsl:attribute>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty -development.net / jyH9rNk

0 голосов
/ 08 ноября 2018

Вы можете использовать следующую, совместимую с Asp.NET, таблицу стилей XSLT-1.0, чтобы выполнить XSLT-преобразование из исходного XML в целевой XML:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>

  <xsl:template match="/FX">
    <xsl:copy>
        <xsl:copy-of select="Order" />
        <Attribute>
            <xsl:attribute name="NAME">
                <xsl:for-each select="Attribute">
                    <xsl:value-of select="@NAME" />
                    <xsl:if test="position() != last()">
                        <xsl:text>, </xsl:text>
                    </xsl:if>
                </xsl:for-each>
            </xsl:attribute>
            <xsl:attribute name="VALUE">
                <xsl:for-each select="Attribute">
                    <xsl:value-of select="@VALUE" />
                    <xsl:if test="position() != last()">
                        <xsl:text>,</xsl:text>
                    </xsl:if>
                </xsl:for-each>
            </xsl:attribute>
        </Attribute>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

Его вывод:

<FX>
  <Order ATTRIBUTE1="ACTIVE" ATTRIBUTE2="CCY"/>
  <Attribute NAME="N1, N2, N3" VALUE="V1,V2,V3"/>
</FX>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...