INPUT:
<?xml version="1.0" encoding="UTF-8"?>
<output>
<input>
<!--details-->
</input>
<meta2>
<Comenzi>
<output_getquerydata>
<queries>
<query name="part1">
<parameters>
<!--details-->
</parameters>
<queryErrors>
<!--details-->
</queryErrors>
<queryResults>
<record id="1">
<column name="id_schedule">3</column>
<column name="VRIdTask">1319648</column>
<column name="MSSinergieOrderP"/>
<column name="MSSinergieTaskP"/>
<column name="VRPlanId">11310337</column>
<column name="TripLabel">189221</column>
<column name="MSSinergieOrderNP"/>
<column name="MSSinergieTaskNP"/>
</record>
<record id="2">
<column name="id_schedule">3</column>
<column name="VRIdTask">1319652</column>
<column name="MSSinergieOrderP">1320566</column>
<column name="MSSinergieTaskP">1319575</column>
<column name="VRPlanId">11310281</column>
<column name="TripLabel">189221</column>
<column name="MSSinergieOrderNP"/>
<column name="MSSinergieTaskNP"/>
</record>
<record id="3">
<column name="id_schedule">3</column>
<column name="VRIdTask">1319652</column>
<column name="MSSinergieOrderP">1320614</column>
<column name="MSSinergieTaskP">1319623</column>
<column name="VRPlanId">11310281</column>
<column name="TripLabel">189221</column>
<column name="MSSinergieOrderNP"/>
<column name="MSSinergieTaskNP"/>
</record>
<record id="4">
<column name="id_schedule">3</column>
<column name="VRIdTask">1319652</column>
<column name="MSSinergieOrderP">1320656</column>
<column name="MSSinergieTaskP">1319667</column>
<column name="VRPlanId">11310281</column>
<column name="TripLabel">189221</column>
<column name="MSSinergieOrderNP"/>
<column name="MSSinergieTaskNP"/>
</record>
</queryResults>
</query>
</queries>
</output_getquerydata>
</Comenzi>
</meta2>
</output>
XSL:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml" />
<xsl:template name="task-attr">
<!--parameter to filter per VRPlanId-->
<xsl:param name="param.VRPlanId"/>
<xsl:variable name="var.mstp">
<xsl:for-each
select="/output/meta2/Comenzi/output_getquerydata/queries/query/queryResults/rec
ord[column[@name='VRPlanId'] = $param.VRPlanId]">
<!--preventing empty blocks and duplicates for MSTP-->
<xsl:if test="string-length(column[@name='MSSinergieTaskP']) >0
and not(preceding::record[column[@name='MSSinergieTaskP']/text() =
current()/column[@name='MSSinergieTaskP']/text()])">
<xsl:value-of select="concat(column[@name='MSSinergieTaskP'],
',')"/>
</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="var.msonpc">
<xsl:for-each
select="/output/meta2/Comenzi/output_getquerydata/queries/query/queryResults/re
cord[column[@name='VRPlanId'] = $param.VRPlanId]">
<!--preventing empty blocks and duplicates for MSONPC-->
<xsl:if test="string-length(column[@name='MSSinergieTaskNP']) >0
and not(preceding::record[column[@name='MSSinergieTaskNP']/text() =
current()/column[@name='MSSinergieTaskNP']/text()])">
<xsl:value-of select="concat(column[@name='MSSinergieTaskNP'],
',')"/>
</xsl:if>
</xsl:for-each>
</xsl:variable>
<!--concat all non-duplicates MSTP and MSONPC without last delimiter-->
<xsl:value-of select="concat($var.mstp, substring($var.msonpc, 1, string-
length($var.msonpc)-1))"/>
</xsl:template>
<xsl:template match="/">
<output>
<xsl:for-each
select="/output/meta2/Comenzi/output_getquerydata/queries/query/queryResults/record">
<xsl:if test ="not(preceding::record[column[@name='VRPlanId']/text() =
current()/column[@name='VRPlanId']/text()])">
<xsl:variable name="task.id">
<xsl:call-template name="task-attr">
<!--as input parameter put non-duplicate VRPlanId-->
<xsl:with-param name="param.VRPlanId"
select="column[@name='VRPlanId']"/>
</xsl:call-template>
</xsl:variable>
<!--if all non-duplicates MSTP and MSONPC will be blank block
Cdo won't be created-->
<xsl:if test="string-length($task.id) >0">
<Cdo>
<parameters>
<task>
<xsl:attribute name="id">
<xsl:value-of select="$task.id"/>
</xsl:attribute>
</task>
<action>
<xsl:attribute name="id">
<xsl:value-of
select="column[@name='VRPlanId']"/>
</xsl:attribute>
</action>
</parameters>
</Cdo>
</xsl:if>
</xsl:if>
</xsl:for-each>
</output>
</xsl:template>
</xsl:stylesheet>
大家好,
感谢您的帮助。 目标是检查我们构建标记的每个不同的VRPlanID值 如果它们在标签的id部分中不为空/空,则将相应的MSTP,MSONPC(不同)分组。 因此,我们在VRPlanID之后进行分组,然后从MSTP / MSONPC的每条记录中获取不同的值。 如果它们是空的,那么只需构建一个虚拟/空消息/标记。 这有效,但我有两个问题: - 我总是得到一个&#39;,&#39;最后一个id之后的逗号,我无法理解为什么 - 我不再需要连接,但我希望每个ID都有一个标记任务
因此,所需的输出将是:
<output>
<Cdo>
<parameters>
<task id="1319575"/>
<task id="1319623"/>
<task id="1319667"/>
<action id="11310281"/>
</parameters>
</Cdo>
</output>
请记住,标签MSSinergieTaskP和MSSinergieTaskNP之间的任何组合都是可能的。所以一个可能是空的,另一个不是。或者只为记录一个空,然后为下一个记录创建一个值。 我只是想为每个不同的VRIdTask获取任何组合的不同值。
我似乎无法使其发挥作用。 有什么建议吗?
答案 0 :(得分:2)
对于XSLT 1.0中的分组,最有效的解决方案是使用muenchian grouping。
在这种情况下,您可以使用属性@name='VRPlanId'
中的值创建分组键。
<xsl:key name="vrPlanId" match="record" use="column[@name='VRPlanId']" />
然后使用密钥
对节点进行分组<xsl:apply-templates select="//record[generate-id() = generate-id(key('vrPlanId', column[@name='VRPlanId'])[1])]" />
因此output
模板被修改为
<xsl:template match="output">
<xsl:copy>
<Cdo>
<parameters>
<xsl:apply-templates select="//record[generate-id() = generate-id(key('vrPlanId', column[@name='VRPlanId'])[1])]" />
</parameters>
</Cdo>
</xsl:copy>
</xsl:template>
对于record
模板,请检查MSSinergieTaskP
或MSSinergieTaskNP
是否有值,然后循环分组节点以获取MSSinergieTaskP
的值。
以下是完整的XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:strip-space elements="*" />
<xsl:key name="vrPlanId" match="record" use="column[@name='VRPlanId']" />
<xsl:template match="output">
<xsl:copy>
<Cdo>
<parameters>
<xsl:apply-templates select="//record[generate-id() = generate-id(key('vrPlanId', column[@name='VRPlanId'])[1])]" />
</parameters>
</Cdo>
</xsl:copy>
</xsl:template>
<xsl:template match="record">
<xsl:if test="column[@name='MSSinergieTaskP'] != '' or column[@name='MSSinergieTaskNP'] != ''">
<action>
<xsl:attribute name="id">
<xsl:value-of select="column[@name='VRPlanId']" />
</xsl:attribute>
</action>
<xsl:for-each select="key('vrPlanId', column[@name='VRPlanId'])">
<task>
<xsl:attribute name="id">
<xsl:value-of select="column[@name='MSSinergieTaskP']" />
</xsl:attribute>
</task>
</xsl:for-each>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
这提供了所需的输出
<output>
<Cdo>
<parameters>
<action id="11310281" />
<task id="1319575" />
<task id="1319623" />
<task id="1319667" />
</parameters>
</Cdo>
</output>