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>
需要帮助了解如何在同一记录 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>