【发布时间】:2017-02-02 17:01:22
【问题描述】:
输入:
<?xml version="1.0" encoding="UTF-8"?>
<comtec>
<record id="1">
<column name="id_task">44422</column>
<column name="capabilityCode">FR-JUNIOR</column>
<column name="ColMiss">miss</column>
<column name="ColHave"/>
<column name="order_externalId">1867139</column>
</record>
<record id="2">
<column name="id_task">44422</column>
<column name="capabilityCode">FR-XXX</column>
<column name="ColMiss"/>
<column name="ColHave">notmiss</column>
<column name="order_externalId">1867139</column>
</record>
<record id="3">
<column name="id_task">44422</column>
<column name="capabilityCode">AVS</column>
<column name="ColMiss"/>
<column name="ColHave">notmiss</column>
<column name="order_externalId">1867139</column>
</record>
<record id="4">
<column name="id_task">60038</column>
<column name="PropertyDescr">ReqMissing</column>
<column name="capabilityCode">FR-AUTOPLAN</column>
<column name="ResCapString">FR-RDV1, FR-GGE1, FR-PARC2, FR-RDV VIP</column>
<column name="ColMiss">miss</column>
<column name="ColHave"/>
<column name="order_externalId">1867454</column>
</record>
<record id="5">
<column name="id_task">60038</column>
<column name="capabilityCode">FR-XXX</column>
<column name="ColMiss">miss</column>
<column name="ColHave"/>
<column name="order_externalId">1867454</column>
</record>
</comtec>
期望的输出:
<comtec>
<task_order>
<id>1867139</id>
<capabilities>
<capability>
<capability_code>FR-JUNIOR</capability_code>
<available>true</available>
</capability>
<capability>
<capability_code>FR-XXX</capability_code>
<required>true</required>
</capability>
<capability>
<capability_code>AVS</capability_code>
<required>true</required>
</capability>
</capabilities>
<task>
<id>1867139</id>
<task_kind_code>drive_through</task_kind_code>
</task>
</task_order>
<task_order>
<id>1867454</id>
<capabilities>
<capability>
<capability_code>FR-AUTOPLAN</capability_code>
<available>true</available>
</capability>
<capability>
<capability_code>FR-XXX</capability_code>
<available>true</available>
</capability>
</capabilities>
<task>
<id>1867454</id>
<task_kind_code>drive_through</task_kind_code>
</task>
</task_order>
</comtec>
你好。所需的输出基于以下逻辑: id_task 有多条记录 a)如果只有“ColMiss”列中的值,则构建空功能标签(输出中的第二个记录标签) b)如果它在“ColMiss”列和“ColHave”中都有值,则仅使用“ColHave”不为空的记录中“CapabilityCode”列中的值构建功能标签。
我希望这是有道理的,我仍然是 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="record" use="record/column[@name='id_task']"/>
<xsl:template match="comtec">
<!--grouped by id_task-->
<xsl:for-each select="record[generate-id(.)=
generate-id(key('record',
record/column[@name='id_task'])[1])]">
<task_order>
<id>
<xsl:value-of select="column[@name='id_task']"/>
</id>
<capabilities>
<!--the fields in capabilities-->
<xsl:variable name="values" select="key('record',
column[@name='id_task'])/
column[@name='ColMiss']"/>
<xsl:choose>
<xsl:when test="$values ='miss'">
<xsl:for-each select="$values ='miss'">
<capability>
<capability_code>
<xsl:value-of select="column[name='capabilityCode']"/>
</capability_code>
<available>true</available>
</capability>
</xsl:for-each>
</xsl:when>
<xsl:when test="$values =''">
<xsl:for-each select="$values =''">
<capability>
<capability_code>
<xsl:value-of select="column[name='capabilityCode']"/>
</capability_code>
<required>true</required>
</capability>
</xsl:for-each>
</xsl:when>
</xsl:choose>
</capabilities>
</task_order>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
如您所见,问题在于它不会将“能力”标签分组在一个父级下,但它会创建一个每记录标签,这是正常的,因为实现了逻辑。 但我认为除了使用键/变量之外还有其他方法。
基于这个 XSL 有没有办法转到所需的输出?
再次感谢您。
【问题讨论】:
-
StackOverflow 上有很多完全回答的 XSLT 分组问题,所有问题都有工作代码,大多数都有完整的解释。选一个,读一读。如果您不明白,请选择另一个,阅读。重复。返回 XSLT 代码,至少 几乎 可以满足您的需求。
-
嗨。我已经更新了我正在使用的没有密钥的 XSL。
-
是的.. 但正如我所说:Muenchian 分组和
<xsl:key>已经在 Stack Overflow 和其他地方被解释了很多次,你完全不可能找到任何关于它如何工作的信息.你有一个普通的一级分组任务,任何关于这个主题的答案都足以让你开始。我已经解释了键如何在更复杂的分组问题的旧答案中起作用(here,在线程中向下滚动)。还有许多其他答案可供选择和学习。 -
更新了 XSL:尝试使用单级分组,但正如我所说,这是我正在研究的 XSL,我一直坚持......如果你愿意帮忙的话。谢谢!
-
我无法理解你描述的逻辑;请编辑您的问题并使其更清楚。