【问题标题】:XSLT - Generate unique id fora each distinct valueXSLT - 为每个不同的值生成唯一的 id
【发布时间】:2020-08-02 02:52:13
【问题描述】:

我正在尝试使用 XSLT-1.0 为每个不同的值生成一个唯一的 ID。我有一个 XSML 结构,每次在标签中找到相同的值时,我都想在输出标签中生成一个唯一的 id。

输入 XML:

<EMPLOYEES>
    <EMPLOYEE>
        <ID>1</ID>
        <NAME>AAA</NAME>
    </EMPLOYEE>
    <EMPLOYEE>
        <ID>2</ID>
        <NAME>AAA</NAME>
    </EMPLOYEE>
    <EMPLOYEE>
        <ID>3</ID>
        <NAME>BBB</NAME>
    </EMPLOYEE>
</EMPLOYEES>

期望的输出:

<RESULT>
    <EMPLOYEE>
        <ID>1</ID>
        <GROUP>1</GROUP>
    </EMPLOYEE>
    <EMPLOYEE>
        <ID>2</ID>
        <GROUP>1</GROUP>
    </EMPLOYEE>
    <EMPLOYEE>
        <ID>3</ID>
        <GROUP>2</GROUP>
    </EMPLOYEE>
</RESULT>

【问题讨论】:

    标签: xslt-1.0


    【解决方案1】:

    您可以使用Muenchian grouping 的变体:

    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="emp-by-name" match="EMPLOYEE" use="NAME" />
    
    <xsl:template match="/EMPLOYEES">
        <RESULT>
            <xsl:for-each select="EMPLOYEE">
                <xsl:copy>
                    <xsl:copy-of select="ID"/>
                    <GROUP>
                        <xsl:value-of select="generate-id(key('emp-by-name', NAME)[1])"/>
                    </GROUP>
                </xsl:copy>
            </xsl:for-each>
        </RESULT>
    </xsl:template>
    
    </xsl:stylesheet>
    

    唯一 id 的格式取决于您使用的处理器:例如,使用 libxslt 您可能会看到如下结果:

    <?xml version="1.0" encoding="UTF-8"?>
    <RESULT>
      <EMPLOYEE>
        <ID>1</ID>
        <GROUP>idm86101615952</GROUP>
      </EMPLOYEE>
      <EMPLOYEE>
        <ID>2</ID>
        <GROUP>idm86101615952</GROUP>
      </EMPLOYEE>
      <EMPLOYEE>
        <ID>3</ID>
        <GROUP>idm86101613584</GROUP>
      </EMPLOYEE>
    </RESULT> 
    

    MSXML 可以产生:

    <?xml version="1.0"?>
    <RESULT>
    <EMPLOYEE>
    <ID>1</ID>
    <GROUP>IDOECYH2JCFIENET332KVV31ACSEILRTQLIHKWOCNC1WN5QJBD3AH</GROUP>
    </EMPLOYEE>
    <EMPLOYEE>
    <ID>2</ID>
    <GROUP>IDOECYH2JCFIENET332KVV31ACSEILRTQLIHKWOCNC1WN5QJBD3AH</GROUP>
    </EMPLOYEE>
    <EMPLOYEE>
    <ID>3</ID>
    <GROUP>IDZZBORVA3LQGFPDQLO51JC1X1JDCTYLF430BB43GE1YQ1D54SHZSB</GROUP>
    </EMPLOYEE>
    </RESULT>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-30
      • 2013-04-19
      • 2013-02-09
      • 1970-01-01
      • 2011-07-05
      • 1970-01-01
      • 2021-01-16
      • 1970-01-01
      相关资源
      最近更新 更多