XSL 为用户生成 UUID 并相应地替换他们的经理引用

XSL to generate UUIDs for users & replace for their manager references accordingly

我在 XML 下面有这个,其中 idmanagerid 相互引用,许多 id 为一个 managerid,我需要将它们的 id 转换为UUID 基于 id 到目标 XML。我正在通过扩展功能使用 Java uuid class。我对目标 XML 中的 maaping genrated uuidmanagerid 感到震惊,非常感谢任何帮助。

<?xml version="1.0" encoding="UTF-8"?>
<userlist>
    <user>
        <id>1</id>
    </user>
    <user>
        <id>2</id>
        <managerid>1</managerid>
    </user>
    <user>
        <id>3</id>
        <managerid>1</managerid>
    </user>
    <user>
        <id>4</id>
        <managerid>2</managerid>
    </user>
    <user>
        <id>5</id>
        <managerid>3</managerid>
    </user>
    <user>
        <id>6</id>
        <managerid>1</managerid>
    </user>
    <user>
        <id>7</id>
        <managerid>2</managerid>
    </user>
    <user>
        <id>8</id>
        <managerid>3</managerid>
    </user>
    <user>
        <id>9</id>
        <managerid>3</managerid>
    </user>
    <user>
        <id>10</id>
        <managerid>1</managerid>
    </user>
</userlist>

XSL:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:uuid="java:java.util.UUID">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:key name="id" match="id" use="."/>

    <!-- identity transform -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="id">
    <xsl:variable name="uid" select="uuid:randomUUID()"/>
        <xsl:copy>
            <xsl:value-of select="$uid"/>           
        </xsl:copy>
    </xsl:template>

    <xsl:template match="managerid">
        <xsl:copy>
            <xsl:value-of select="key('id', .)"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

你的问题措辞很糟糕。如果我没理解错的话,管理者也是用户。因此,您想用 UUID 替换每个用户的 id - 如果该用户也是管理员 - 将相应的 managerid 替换为 相同 UUID.

这可以通过以下方式完成:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:uuid="java:java.util.UUID">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:variable name="new-ids">
    <xsl:for-each select="/userlist/user">
        <new-id old-id="{id}">
            <xsl:value-of select="uuid:randomUUID()"/>
        </new-id>
    </xsl:for-each>
</xsl:variable>

<xsl:key name="new-id" match="new-id" use="@old-id" />

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="id | managerid">
    <xsl:copy>
        <xsl:value-of select="key('new-id', ., $new-ids)"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>