忽略重复值xml 1.0

时间:2017-01-18 16:56:08

标签: xml xslt grouping unique-values

<?xml version="1.0" encoding="utf-8"?>
<order>
<press_mow>
  <mow_section_id>1</mow_section_id>
    <mow_webs>
        <mow_web>
            <web_number>1</web_number>
        </mow_web>
    </mow_webs>
</press_mow>
<press_mow>
  <mow_section_id>1</mow_section_id>
    <mow_webs>
        <mow_web>
            <web_number>1</web_number>
        </mow_web>
    </mow_webs>
</press_mow>
<press_mow>
  <mow_section_id>2</mow_section_id>
    <mow_webs>
        <mow_web>
            <web_number>1</web_number>
        </mow_web>
       <mow_web>
            <web_number>2</web_number>
        </mow_web>
       <mow_web>
            <web_number>2</web_number>
        </mow_web>
        <mow_web>
            <web_number>3</web_number>
        </mow_web>
        <mow_web>
            <web_number>3</web_number>
        </mow_web>
    </mow_webs>
</press_mow>
<press_mow>
  <mow_section_id>2</mow_section_id>
    <mow_webs>
        <mow_web>
            <web_number>1</web_number>
        </mow_web>
       <mow_web>
            <web_number>2</web_number>
        </mow_web>
       <mow_web>
            <web_number>2</web_number>
        </mow_web>
        <mow_web>
            <web_number>3</web_number>
        </mow_web>
        <mow_web>
            <web_number>3</web_number>
        </mow_web>
    </mow_webs>
</press_mow>
<press_mow>
  <mow_section_id>2</mow_section_id>
    <mow_webs>
        <mow_web>
            <web_number>1</web_number>
        </mow_web>
       <mow_web>
            <web_number>2</web_number>
        </mow_web>
       <mow_web>
            <web_number>2</web_number>
        </mow_web>
        <mow_web>
            <web_number>3</web_number>
        </mow_web>
        <mow_web>
            <web_number>3</web_number>
        </mow_web>
    </mow_webs>
</press_mow>

</order>

尝试使用menchian分组创建一个唯一的mow_webs / mow_web / web_number列表但是在每个press_mow中我要么只得到123一次或者每个press_mow中的所有数字都无法看到我做错了什么帮助非常感谢。

期望的输出

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

花了几个小时查看这个方法的所有解释并且以前使用效果很好但是在这个场合看不出我的错误。以下尝试了两种不同的方法。只能使用xml 1.0。如果我犯了错误,这是我第一次提前道歉。

<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">

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

<xsl:for-each select="press_mow">
    SecIdA:<xsl:value-of select="mow_section_id"/>/
    <xsl:for-each select="mow_webs">
        <xsl:for-each select="mow_web[count(. | key('webnoB', web_number)           [1]) = 1]">
            WebNoA:<xsl:value-of select="web_number"/>
        </xsl:for-each>
    </xsl:for-each>
</xsl:for-each>
**************
<xsl:for-each select="press_mow[count(. | key('webnoC', web_number)[1]) = 1]">
    secidB:<xsl:value-of select="mow_section_id"/>/
    <xsl:for-each select="mow_webs">
        <xsl:for-each select="mow_web">
            WebNo.B:<xsl:value-of select="web_number"/>
        </xsl:for-each>
    </xsl:for-each>
</xsl:for-each>
******TESTING HERE********

</xsl:template>

1 个答案:

答案 0 :(得分:0)

如果 - 看起来 - 您希望在每个web_number中列出不同的press_mow值,则必须在密钥定义和用法中包含press_mow标识符。

由于您的输入没有标识press_mow节点的唯一值,因此您需要使用generate-id()函数。

考虑以下样式表:

XSLT 1.0

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