XSLT 一级分组
XSLT one-level grouping
输入:
<Root>
<line id="1">
<subline name="id">23</subline>
<subline name="text">mic</subline>
<subline name="Available">yes</subline>
<subline name="Unavailable"/>
</line>
<line id="2">
<subline name="id">23</subline>
<subline name="text">XrJ</subline>
<subline name="Available"/>
<subline name="Unavailable">yes</subline>
</line>
<line id="3">
<subline name="id">23</subline>
<subline name="text">mare</subline>
<subline name="Available"/>
<subline name="Unavailable">yes</subline>
</line>
<line id="4">
<subline name="id">574</subline>
<subline name="text">mic</subline>
<subline name="Available">yes</subline>
<subline name="Unavailable"/>
</line>
<line id="5">
<subline name="id">574</subline>
<subline name="text">centrer</subline>
<subline name="Available">yes</subline>
<subline name="Unavailable"/>
</line>
</Root>
期望的输出:
<Root>
<update>
<id>23</id>
<reqUpdate>
<diff>
<text>mic</text>
<available>yes</available>
</diff>
<diff>
<text>XrJ</text>
<unavailable>yes</unavailable>
</diff>
<diff>
<text>mare</text>
<unavailable>yes</unavailable>
</diff>
</reqUpdate>
</update>
<update>
<id>574</id>
<reqUpdate>
<diff>
<text>mic</text>
<available>yes</available>
</diff>
<diff>
<text>centrer</text>
<available>yes</available>
</diff>
</reqUpdate>
</update>
</Root>
我希望为每个唯一 ID 使用子行 'TEXT' 中的值构建不同的 "DIFF" 标签,并添加该文本是否可用,如您所见,我们有此信息在子行 -'available' / 'unavailable'
因此,对于 "DIFF" 标签中的每个唯一 ID 应具有来自文本(来自每条记录)的值以及带有文本 = 的标签 "available" 或 "unavailable"是的。
我似乎无法掌握如何做这样的事情,我处理的每个 xsl 都没有返回任何内容,所以我放弃了,现在我被卡住了。
请帮助,非常感谢帮助菜鸟。
编辑:
我的 XSL:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml"/>
<xsl:key name="record" match="line" use="subline[@name='id']"/>
<xsl:template match="Root">
<Root>
<xsl:for-each select="line[generate-id(.)=
generate-id(key('record',subline[@name='id'])[1])]">
<update>
<id>
<xsl:value-of select="subline [@name='id']"/>
</id>
<reqUpdate>
<xsl:variable name="values" select="key('record',subline[@name='id'])/subline[@name='Available']"/>
<xsl:choose>
<xsl:when test="$values">
<xsl:for-each select="$values">
<dif>
<text>
<xsl:value-of select="./subline[name='text']"/>
</text>
<available>yes</available>
</dif>
</xsl:for-each>
</xsl:when>
<xsl:when test="not($values)">
<xsl:for-each select="$values">
<dif>
<text>
<xsl:value-of select="./subline[name='text']"/>
</text>
<unavailable>yes</unavailable>
</dif>
</xsl:for-each>
</xsl:when>
</xsl:choose>
</reqUpdate>
</update>
</xsl:for-each>
</Root>
</xsl:template>
</xsl:stylesheet>
我当前的输出:
enter code here
<Root>
<update>
<id>23</id>
<reqUpdate>
<dif>
<text/>
<available>yes</available>
</dif>
<dif>
<text/>
<available>yes</available>
</dif>
<dif>
<text/>
<available>yes</available>
</dif>
</reqUpdate>
</update>
<update>
<id>574</id>
<reqUpdate>
<dif>
<text/>
<available>yes</available>
</dif>
<dif>
<text/>
<available>yes</available>
</dif>
</reqUpdate>
</update>
</Root>
我建议你这样做:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="record" match="line" use="subline[@name='id']"/>
<xsl:template match="/Root">
<Root>
<xsl:for-each select="line[generate-id(.)=generate-id(key('record',subline[@name='id'])[1])]">
<update>
<id>
<xsl:value-of select="subline[@name='id']"/>
</id>
<reqUpdate>
<xsl:for-each select="key('record', subline[@name='id'])">
<diff>
<text>
<xsl:value-of select="subline[@name='text']"/>
</text>
<xsl:if test="subline[@name='Available']='yes'">
<available>yes</available>
</xsl:if>
<xsl:if test="subline[@name='Unavailable']='yes'">
<unavailable>yes</unavailable>
</xsl:if>
</diff>
</xsl:for-each>
</reqUpdate>
</update>
</xsl:for-each>
</Root>
</xsl:template>
</xsl:stylesheet>
P.S。恕我直言,目标结构不是最优的;我希望有一个节点具有常量 name(例如 available
)并更改 content(例如 yes
或no
)。你现在的处理方式和原来的一样难处理。
输入:
<Root>
<line id="1">
<subline name="id">23</subline>
<subline name="text">mic</subline>
<subline name="Available">yes</subline>
<subline name="Unavailable"/>
</line>
<line id="2">
<subline name="id">23</subline>
<subline name="text">XrJ</subline>
<subline name="Available"/>
<subline name="Unavailable">yes</subline>
</line>
<line id="3">
<subline name="id">23</subline>
<subline name="text">mare</subline>
<subline name="Available"/>
<subline name="Unavailable">yes</subline>
</line>
<line id="4">
<subline name="id">574</subline>
<subline name="text">mic</subline>
<subline name="Available">yes</subline>
<subline name="Unavailable"/>
</line>
<line id="5">
<subline name="id">574</subline>
<subline name="text">centrer</subline>
<subline name="Available">yes</subline>
<subline name="Unavailable"/>
</line>
</Root>
期望的输出:
<Root>
<update>
<id>23</id>
<reqUpdate>
<diff>
<text>mic</text>
<available>yes</available>
</diff>
<diff>
<text>XrJ</text>
<unavailable>yes</unavailable>
</diff>
<diff>
<text>mare</text>
<unavailable>yes</unavailable>
</diff>
</reqUpdate>
</update>
<update>
<id>574</id>
<reqUpdate>
<diff>
<text>mic</text>
<available>yes</available>
</diff>
<diff>
<text>centrer</text>
<available>yes</available>
</diff>
</reqUpdate>
</update>
</Root>
我希望为每个唯一 ID 使用子行 'TEXT' 中的值构建不同的 "DIFF" 标签,并添加该文本是否可用,如您所见,我们有此信息在子行 -'available' / 'unavailable'
因此,对于 "DIFF" 标签中的每个唯一 ID 应具有来自文本(来自每条记录)的值以及带有文本 = 的标签 "available" 或 "unavailable"是的。
我似乎无法掌握如何做这样的事情,我处理的每个 xsl 都没有返回任何内容,所以我放弃了,现在我被卡住了。
请帮助,非常感谢帮助菜鸟。
编辑:
我的 XSL:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml"/>
<xsl:key name="record" match="line" use="subline[@name='id']"/>
<xsl:template match="Root">
<Root>
<xsl:for-each select="line[generate-id(.)=
generate-id(key('record',subline[@name='id'])[1])]">
<update>
<id>
<xsl:value-of select="subline [@name='id']"/>
</id>
<reqUpdate>
<xsl:variable name="values" select="key('record',subline[@name='id'])/subline[@name='Available']"/>
<xsl:choose>
<xsl:when test="$values">
<xsl:for-each select="$values">
<dif>
<text>
<xsl:value-of select="./subline[name='text']"/>
</text>
<available>yes</available>
</dif>
</xsl:for-each>
</xsl:when>
<xsl:when test="not($values)">
<xsl:for-each select="$values">
<dif>
<text>
<xsl:value-of select="./subline[name='text']"/>
</text>
<unavailable>yes</unavailable>
</dif>
</xsl:for-each>
</xsl:when>
</xsl:choose>
</reqUpdate>
</update>
</xsl:for-each>
</Root>
</xsl:template>
</xsl:stylesheet>
我当前的输出:
enter code here
<Root>
<update>
<id>23</id>
<reqUpdate>
<dif>
<text/>
<available>yes</available>
</dif>
<dif>
<text/>
<available>yes</available>
</dif>
<dif>
<text/>
<available>yes</available>
</dif>
</reqUpdate>
</update>
<update>
<id>574</id>
<reqUpdate>
<dif>
<text/>
<available>yes</available>
</dif>
<dif>
<text/>
<available>yes</available>
</dif>
</reqUpdate>
</update>
</Root>
我建议你这样做:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="record" match="line" use="subline[@name='id']"/>
<xsl:template match="/Root">
<Root>
<xsl:for-each select="line[generate-id(.)=generate-id(key('record',subline[@name='id'])[1])]">
<update>
<id>
<xsl:value-of select="subline[@name='id']"/>
</id>
<reqUpdate>
<xsl:for-each select="key('record', subline[@name='id'])">
<diff>
<text>
<xsl:value-of select="subline[@name='text']"/>
</text>
<xsl:if test="subline[@name='Available']='yes'">
<available>yes</available>
</xsl:if>
<xsl:if test="subline[@name='Unavailable']='yes'">
<unavailable>yes</unavailable>
</xsl:if>
</diff>
</xsl:for-each>
</reqUpdate>
</update>
</xsl:for-each>
</Root>
</xsl:template>
</xsl:stylesheet>
P.S。恕我直言,目标结构不是最优的;我希望有一个节点具有常量 name(例如 available
)并更改 content(例如 yes
或no
)。你现在的处理方式和原来的一样难处理。