XSLT:for-each循环,键不返回所有节点

时间:2014-06-17 15:13:45

标签: xslt xpath foreach missing-data

我是新手XSLT开发人员。我被要求在原始开发人员不再与我们合作的项目中解决问题。在XSLT中,使用for-eachkey

进行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,但我真的不知道。而且我不知道如何修改它。想法?如果我需要包含更多数据,请告诉我。

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)。

如果您在源中更改其中一个值,则应该能够同时选择这两个值并进行验证。