XSLT - 为每个不同的值生成唯一的 ID
XSLT - Generate unique id fora each distinct value
我正在尝试使用 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>
您可以使用 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>
我正在尝试使用 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>
您可以使用 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>