Xml XSLT条件计数

Xml XSLT条件计数,xml,xslt,xpath,Xml,Xslt,Xpath,此网站的新功能。希望有人能帮我找出为什么我的代码不起作用。我使用了这个网站上其他一些关于这个主题的帖子,但看不到我的错误 <!-- Keyset based on the Subject (Part Number) --> <xsl:key name="key_PartNumber" match="Subject" use="."/> <xsl:template match="/"> <BOM> <!-- Do for e

此网站的新功能。希望有人能帮我找出为什么我的代码不起作用。我使用了这个网站上其他一些关于这个主题的帖子,但看不到我的错误

<!-- Keyset based on the Subject (Part Number) -->
<xsl:key name="key_PartNumber" match="Subject" use="."/>

<xsl:template match="/">
   <BOM>
      <!-- Do for each unique Subject (Part Number) -->
      <xsl:for-each select="//Markup/Subject[generate-id() = generate-id(key('key_PartNumber', .)[1])]">
         <Part>
            <xsl:attribute name="Part_Number">
               <xsl:value-of select="."/>
            </xsl:attribute>
            <xsl:attribute name="Count">
               <xsl:value-of select="count(//Markup[Subject=.])"/>
            </xsl:attribute>
          </Part>
      </xsl:for-each>
   </BOM>
</xsl:template>

</xsl:stylesheet>
XSLT:

<!-- Keyset based on the Subject (Part Number) -->
<xsl:key name="key_PartNumber" match="Subject" use="."/>

<xsl:template match="/">
   <BOM>
      <!-- Do for each unique Subject (Part Number) -->
      <xsl:for-each select="//Markup/Subject[generate-id() = generate-id(key('key_PartNumber', .)[1])]">
         <Part>
            <xsl:attribute name="Part_Number">
               <xsl:value-of select="."/>
            </xsl:attribute>
            <xsl:attribute name="Count">
               <xsl:value-of select="count(//Markup[Subject=.])"/>
            </xsl:attribute>
          </Part>
      </xsl:for-each>
   </BOM>
</xsl:template>

</xsl:stylesheet>

当我运行转换时,我总是得到0的计数。 下面是示例xml文件的屏幕截图,以及获得正确结果的xpath查询的结果。

[Subject=current()]
替换
[Subject=.]
。上下文项在谓词中更改。

如前所述,您的方法存在的问题是,在谓词中使用缩写
时,它指的是谓词之前的节点,而不是当前上下文节点:

<!-- Keyset based on the Subject (Part Number) -->
<xsl:key name="key_PartNumber" match="Subject" use="."/>

<xsl:template match="/">
   <BOM>
      <!-- Do for each unique Subject (Part Number) -->
      <xsl:for-each select="//Markup/Subject[generate-id() = generate-id(key('key_PartNumber', .)[1])]">
         <Part>
            <xsl:attribute name="Part_Number">
               <xsl:value-of select="."/>
            </xsl:attribute>
            <xsl:attribute name="Count">
               <xsl:value-of select="count(//Markup[Subject=.])"/>
            </xsl:attribute>
          </Part>
      </xsl:for-each>
   </BOM>
</xsl:template>

</xsl:stylesheet>
但是,正确的解决方案是重用密钥:

<!-- Keyset based on the Subject (Part Number) -->
<xsl:key name="key_PartNumber" match="Subject" use="."/>

<xsl:template match="/">
   <BOM>
      <!-- Do for each unique Subject (Part Number) -->
      <xsl:for-each select="//Markup/Subject[generate-id() = generate-id(key('key_PartNumber', .)[1])]">
         <Part>
            <xsl:attribute name="Part_Number">
               <xsl:value-of select="."/>
            </xsl:attribute>
            <xsl:attribute name="Count">
               <xsl:value-of select="count(//Markup[Subject=.])"/>
            </xsl:attribute>
          </Part>
      </xsl:for-each>
   </BOM>
</xsl:template>

</xsl:stylesheet>
<xsl:value-of select="count(key('key_PartNumber', .))"/>

这是有效的。非常感谢,特别是链接和解释。如果我不理解这个概念的话,未来的悲伤我会很难过的!