xml - XSLT 格式化输出已完成 90%

标签 xml xslt xpath

我正在尝试处理一些 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>

有人可以帮忙吗?

最佳答案

用途:

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

关于xml - XSLT 格式化输出已完成 90%,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9771196/

相关文章:

xslt - 理解一些 xpath 表达式

xml - 在 perl 中使用 LibXML

html - XPath 根据兄弟/表亲文本选择元素?

jquery - 使用有效样式使用 jQuery 查找 HTML 元素(从 CSS 类继承的样式,而不是在元素上显式)

javascript - 将 jQuery Accordion 与 GallerificPlus 结合使用时发生冲突

xslt 中的 XML 命名空间处理

xpath - 如何选择结合前兄弟和后兄弟的节点?

python - 在 Python 3 中遍历 TEI,某些实体的文本为空

java - XML 请求格式不正确或请求不完整

python - 为什么在使用 lxml(在 python 中)处理 XHTML 文档时 xpath 不起作用?