XML 中不区分大小写的过滤器节点,采用 XSL 转换

Case insensive filter nodes from XML with XSL transform

我正在使用 XSLT 1.0。我有一个 XML 文档:

<profile>
    <properties>
        <property>
            <name>Email</name>
            <value>test@mail.com</value>
        </property>
        <property>
            <name>joinDate</name>
            <value>1590438658</value>
        </property>
        <property>
            <name>LAST_LOGIN</name>
            <value>1591638684</value>
        </property>
        <property>
            <name>address</name>
            <value>1197 Franklin Street, Independence, Oregon 97351</value>
        </property>
        <!-- ... -->
    </properties>
</profile>

属性 名称的大小写不一致,它们可以根据文档更改(例如 Email 在另一个文档中可能是 email)。 我想根据 name 标签的不区分大小写的值保留 property 个节点。

例如,我想让 property 个节点的 name 等于 emailaddress(不区分大小写)。

预期输出:

<profile>
    <properties>
        <property>
            <name>Email</name>
            <value>test@mail.com</value>
        </property>
        <property>
            <name>address</name>
            <value>1197 Franklin Street, Independence, Oregon 97351</value>
        </property>
        <!-- ... -->
    </properties>
</profile>

我试过这个 XSL 转换,但它不区分大小写:

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

    <xsl:template match="*[local-name()='property'][not(*[local-name()='name']
        [.='email' or .='address']
        )]"/>

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

我找到了解决方案:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" omit-xml-declaration="yes" />
    <xsl:variable name="lowercase" select="'abcdefghijklmnopqrstuvwxyz'"/>
    <xsl:variable name="uppercase" select="'ABCDEFGHIJKLMNOPQRSTUVWXYZ'"/>

    <xsl:template match="*[local-name()='property'][not(*[local-name()='name']
        [translate(., $uppercase, $lowercase)='joindate' or
         translate(., $uppercase, $lowercase)='last_login'])]"/>

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

如果有人能更优雅地展示这个,那么我会接受这个答案。