忽略重复值xml 1.0

忽略重复值xml 1.0,xml,xslt,grouping,unique-values,Xml,Xslt,Grouping,Unique Values,我花了几个小时来研究这个方法的所有解释,以前使用过效果很好的方法,但这次看不出我的错误是什么。我在下面尝试了两种不同的方法。只能使用xml 1.0。这是我的第一篇帖子,如果我犯了错误,我会提前道歉 1 = 1 1 = 1 2 = 1,2,3 2 = 1,2,3 2 = 1,2,3 ******在这里测试******** <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

我花了几个小时来研究这个方法的所有解释,以前使用过效果很好的方法,但这次看不出我的错误是什么。我在下面尝试了两种不同的方法。只能使用xml 1.0。这是我的第一篇帖子,如果我犯了错误,我会提前道歉

1 = 1
1 = 1
2 = 1,2,3
2 = 1,2,3
2 = 1,2,3

******在这里测试********

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>

<xsl:key name="webnoB" match="mow_web" use="web_number" />
<xsl:key name="webnoC" match="mow_webs" use="mow_web/web_number" />
<xsl:template match="order">

塞西达:/
网络NOA:
**************
secidB:/
网站编号B:
******在这里测试********


如果您想在每个
press\u mow
中列出不同的
web\u编号
值,则必须在密钥定义和用法中包含
press\u mow
标识符

由于您的输入没有唯一的值来标识
press\u mow
节点,因此需要使用
generate-id()

考虑以下样式表:

XSLT1.0

</xsl:template>

应用于输入示例,结果将是:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:key name="wn" match="mow_web" use="concat(web_number, '|', generate-id(ancestor::press_mow))" />

<xsl:template match="/order">
    <root>
        <xsl:for-each select="press_mow">
            <section id="{mow_section_id}">
                <xsl:for-each select="mow_webs/mow_web[count(. | key('wn', concat(web_number, '|', generate-id(ancestor::press_mow)))[1]) = 1]">
                    <number>
                        <xsl:value-of select="web_number"/>
                    </number>
                </xsl:for-each>
            </section>
        </xsl:for-each>
    </root>
</xsl:template>

</xsl:stylesheet>

1.
1.
1.
2.
3.
1.
2.
3.
1.
2.
3.

请发布您希望得到的准确结果(作为代码)。感谢您的快速回复,我将尝试一下,并向您通报我的进度。谢谢你,这工作做得很好。我必须承认我不理解代码或它是如何工作的-有可能解释密钥和生成id代码吗?或者推荐一个我可以了解更多关于这是如何工作的地方,我已经在互联网上搜索过了,但我的头脑还没有完全清醒过来。。。非常感谢您的帮助。
generate-id()
函数为输入XML中的每个节点返回一个唯一的id。该键将
web\u number
的值与其祖先的id组合在一起
press\u mow
-因此它使我们能够在每个
press\u mow
中选择唯一的值。如果没有这一点,Muenchian方法将在整个文档中选择唯一的值。
</xsl:template>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:key name="wn" match="mow_web" use="concat(web_number, '|', generate-id(ancestor::press_mow))" />

<xsl:template match="/order">
    <root>
        <xsl:for-each select="press_mow">
            <section id="{mow_section_id}">
                <xsl:for-each select="mow_webs/mow_web[count(. | key('wn', concat(web_number, '|', generate-id(ancestor::press_mow)))[1]) = 1]">
                    <number>
                        <xsl:value-of select="web_number"/>
                    </number>
                </xsl:for-each>
            </section>
        </xsl:for-each>
    </root>
</xsl:template>

</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?>
<root>
   <section id="1">
      <number>1</number>
   </section>
   <section id="1">
      <number>1</number>
   </section>
   <section id="2">
      <number>1</number>
      <number>2</number>
      <number>3</number>
   </section>
   <section id="2">
      <number>1</number>
      <number>2</number>
      <number>3</number>
   </section>
   <section id="2">
      <number>1</number>
      <number>2</number>
      <number>3</number>
   </section>
</root>