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', .))"/>
这是有效的。非常感谢,特别是链接和解释。如果我不理解这个概念的话,未来的悲伤我会很难过的!