Форматирование XSLT завершено на 90% - PullRequest
2 голосов
/ 19 марта 2012

Я пытаюсь обработать некоторый XML, чтобы преобразовать его так, чтобы этот ввод, однако проблема, которую я получаю, может быть лучше проиллюстрирована ниже:

ВХОД

<?xml version="1.0" encoding="UTF8"?>
 <doc:ZINITIALIZE_FILTERS.Response xmlns:doc="urn:sapcom:document:sap:rfc:functions">
    <MESSAGE>Success</MESSAGE>
    <STATUS>0</STATUS>
     <COLLECTION>
         <item>
            <COLLECTION>A1</COLLECTION>
            <SEASON>S09</SEASON>
            <TEXT>Spring Market A1</TEXT>
        </item>
         <item>
            <COLLECTION>A1</COLLECTION>
            <SEASON>S10</SEASON>
            <TEXT>Spring Market A1</TEXT>
        </item>
     </COLLECTION>
</doc:ZINITIALIZE_FILTERS.Response>

Желаемый результат:

<?xml version="1.0" encoding="UTF8"?>
 <doc:ZINITIALIZE_FILTERS.Response xmlns:doc="urn:sapcom:document:sap:rfc:functions">
    <MESSAGE>Success</MESSAGE>
    <STATUS>0</STATUS>
     <COLLECTION>
         <item>
            <COLLECTION>A1</COLLECTION>
            <SEASON>S09,S10</SEASON>
            <TEXT>Spring Market A1</TEXT>
        </item>
     </COLLECTION>
</doc:ZINITIALIZE_FILTERS.Response>

Используется XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:output method="xml" indent="yes"/>

    <xsl:key name="k" match="item" use="COLLECTION"/>

    <xsl:template match="/ZINITIALIZE_FILTERS.Response">
        <xsl:copy>
            <COLLECTIONS>
                <xsl:apply-templates select="COLLECTION/item[generate-id() = 
                    generate-id(key('k', COLLECTION))]"/>
            </COLLECTIONS>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="COLLECTION/item">
        <xsl:copy>
            <xsl:copy-of select="COLLECTION"/>
            <SEASON>
                <xsl:for-each select="key('k', COLLECTION)">
                    <xsl:value-of select="SEASON"/>

                    <xsl:if test="position() != last()">
                        <xsl:text>,</xsl:text>
                    </xsl:if>
                </xsl:for-each>
            </SEASON>
            <xsl:copy-of select="TEXT"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

ТЕКУЩИЙ НЕПРАВИЛЬНЫЙ ВЫХОД:

<?xml version="1.0" encoding="UTF-8"?>
  <ZINITIALIZE_FILTERS.Response xmlns=""><?xml version="1.0"?>
    Success0<item xmlns:doc="urn:sap-com:document:sap:rfc:functions"><COLLECTION>A1</COLLECTION><SEASON>S09,S10,S12</SEASON><TEXT>Spring Market A1</TEXT></item>
  </ZINITIALIZE_FILTERS.Response>

Кто-нибудь может помочь?

1 Ответ

2 голосов
/ 19 марта 2012

Использование:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="xml" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:key name="k" match="item" use="COLLECTION"/>

    <xsl:template match="item[generate-id() = generate-id(key('k', COLLECTION))]">
        <xsl:copy>
            <xsl:copy-of select="COLLECTION"/>
            <SEASON>
                <xsl:for-each select="key('k', COLLECTION)">
                    <xsl:value-of select="SEASON"/>

                    <xsl:if test="position() != last()">
                        <xsl:text>,</xsl:text>
                    </xsl:if>
                </xsl:for-each>
            </SEASON>
            <xsl:copy-of select="TEXT"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="item"/>

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

</xsl:stylesheet>

При применении к этому XML:

<doc:ZINITIALIZE_FILTERS.Response xmlns:doc="urn:sapcom:document:sap:rfc:functions">
    <MESSAGE>Success</MESSAGE>
    <STATUS>0</STATUS>
    <COLLECTION>
        <item>
            <COLLECTION>A1</COLLECTION>
            <SEASON>S09</SEASON>
            <TEXT>Spring Market A1</TEXT>
        </item>
        <item>
            <COLLECTION>A1</COLLECTION>
            <SEASON>S10</SEASON>
            <TEXT>Spring Market A1</TEXT>
        </item>
    </COLLECTION>
</doc:ZINITIALIZE_FILTERS.Response>

дает желаемый правильный результат:

<doc:ZINITIALIZE_FILTERS.Response xmlns:doc="urn:sapcom:document:sap:rfc:functions">
  <MESSAGE>Success</MESSAGE>
  <STATUS>0</STATUS>
  <COLLECTION>
    <item>
      <COLLECTION>A1</COLLECTION>
      <SEASON>S09,S10</SEASON>
      <TEXT>Spring Market A1</TEXT>
    </item>
  </COLLECTION>
</doc:ZINITIALIZE_FILTERS.Response>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...