我是新手XSLT开发人员。我被要求在原始开发人员不再与我们合作的项目中解决问题。在XSLT中,使用for-each
和key
count
循环
<xsl:for-each select="ns0:BOM[count(. | key('subsat', ns0:BomText01)[1]) = 1][ns0:BomText01]">
...
这是key
:
<xsl:key name="subsat" match="ns0:Parts/ns0:BOM[ns0:FindNum!='0']" use="ns0:BomText01" />
在正在转换的XML文件中,有两个兄弟节点代表子部分:
<ns0:BOM referentId="10000:65091335:65359080">
<ns0:BomText01>3069260-303-SUB0027</ns0:BomText01>
<ns0:ItemNumber>My_part_1</ns0:ItemNumber>
<ns0:ItemType>Part</ns0:ItemType>
<ns0:Qty>67</ns0:Qty>
</ns0:BOM>
<ns0:BOM referentId="10000:65102551:86713230">
<ns0:BomText01>3069260-303-SUB0027</ns0:BomText01>
<ns0:ItemNumber>My_part_2</ns0:ItemNumber>
<ns0:ItemType>Part</ns0:ItemType>
<ns0:Qty>67</ns0:Qty>
</ns0:BOM>
但是,循环只是拾取第一个节点(My_part_1
)。我怀疑是因为count=1
,但我真的不知道。而且我不知道如何修改它。想法?如果我需要包含更多数据,请告诉我。
答案 0 :(得分:1)
假设您的XSLT的相关部分看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns0="ns0" version="1.0">
<xsl:key name="subsat" match="ns0:BOM[ns0:FindNum!='0']" use="ns0:BomText01"/>
<xsl:template match="ns0:Parts">
<xsl:for-each
select="ns0:BOM[count(. | key('subsat', ns0:BomText01)[1]) = 1][ns0:BomText01]">
<xsl:value-of select="."/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
它只打印第一个元素,因为它选择的BOM
元素具有唯一 BomText01
值。这是预期的结果。
如果BomText01
是一个ID字段(看起来是这样)并且您希望得到两个结果(可能是因为他们的ItemNumber
包含不同的值),错误可能在您的来源中(如果不应该这样做,则分配相同的ID)。
如果您在源中更改其中一个值,则应该能够同时选择这两个值并进行验证。