combine/group xml 一行元素属性

combine/group xml element attributes in one line

需要帮助了解如何在同一记录 ID 下为每个品牌在一行中显示所有品牌(?)?

输入xml

<?xml version='1.0' encoding='UTF-8'?>
<ns1:Bags xmlns:ns1="test" id="3430">
  <ns1:inventory>
    <ns1:record id="3431" name="001">
      <ns1:brands>
        <ns1:brand brand1="kate spade" />
        <ns1:brand brand2="michael kors" />
        <ns1:brand brand3="coach" />
        <ns1:brand brand4="tory burch" />
        <ns1:brand brand5="dkny" />
      </ns1:brands>
    </ns1:record>
    <ns1:record id="3431" name="001">
      <ns1:brands>
        <ns1:brand brand1="calvin klein" />
        <ns1:brand brand2="fossil" />
        <ns1:brand brand3="tommy hilfiger" />
      </ns1:brands>
    </ns1:record>
    <ns1:record id="3435" name="002">
      <ns1:brands>
        <ns1:brand brand1="charles and keith" />
        <ns1:brand brand2="farfois" />
        <ns1:brand brand3="victoria's secret" />
      </ns1:brands>
    </ns1:record>
  </ns1:inventory>
</ns1:Bags>

输出xml

<?xml version='1.0' encoding='UTF-8'?>
<ns1:Bags xmlns:ns1="test" id="3430">
  <ns1:inventory>
    <ns1:record id="3431" name="001">
      <ns1:brands>
        <ns1:brand brand1="kate spade" brand2="michael kors" brand3="coach" brand4="tory burch" brand5="dkny" />
        <ns1:brand brand1="calvin klein" brand2="fossil" brand3="tommy hilfiger" />
      </ns1:brands>
    </ns1:record>
    <ns1:record id="3435" name="002">
      <ns1:brands>
        <ns1:brand brand1="charles & keith" brand2="farfois" brand3="victoria's secret" />
      </ns1:brands>
    </ns1:record>
  </ns1:inventory>
</ns1:Bags>

尝试按照建议使用分组,但没有任何反应,仍然没有按相同的 ID 对“记录”进行分组。与品牌相同。

<xsl:template match="record">
    <xsl:for-each-group select="record" group-by="@id">
        <record id="{current-grouping-key()}">
        </record>
    </xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>

也尝试了下面的“品牌”但没有成功

<xsl:template match="brand">
    <xsl:element name="{concat('brand1', @brand2, @brand3, @brand4, @brand5)}">
    </xsl:element>
</xsl:template>

大概是这样的:

  <xsl:template match="inventory">
    <xsl:copy>
      <xsl:for-each-group select="record" group-by="@id">
        <xsl:copy>
          <xsl:apply-templates select="@*"/>
          <ns1:brands>
            <xsl:apply-templates select="current-group()/brands"/>
          </ns1:brands>
        </xsl:copy>
      </xsl:for-each-group>
    </xsl:copy>
  </xsl:template>
  
  <xsl:template match="brands">
    <brand>
      <xsl:apply-templates select="brand/@*"/>
    </brand>
  </xsl:template>
  

使用例如身份副本<xsl:mode on-no-match="shallow-copy"/>到位

至于您在编辑中添加的名称空间,请参阅 https://xsltfiddle.liberty-development.net/asoTKt/1,其中声明 xpath-default-namespace 以便于选择,并在 ns1 名称空间中创建结果元素:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
xpath-default-namespace="test"
xmlns:ns1="test"
version="3.0">
    
    <xsl:output indent="yes"/>

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

    <xsl:template match="inventory">
        <xsl:copy>
            <xsl:for-each-group select="record" group-by="@name">
                <xsl:copy>
                    <xsl:apply-templates select="@*"/>
                    <ns1:brands>
                        <xsl:apply-templates select="current-group()/brands"/>
                    </ns1:brands>
                </xsl:copy>
            </xsl:for-each-group>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="brands">
        <ns1:brand>
            <xsl:apply-templates select="brand/@*" />
        </ns1:brand>
    </xsl:template>

</xsl:stylesheet>