具有XSL变换的XML中的区分大小写过滤器节点

问题描述 投票:0回答:1

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

<profile>
    <properties>
        <property>
            <name>Email</name>
            <value>[email protected]</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)。 我想根据property标签的大小写不敏感值保留name个节点。

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

预期输出:

<profile>
    <properties>
        <property>
            <name>Email</name>
            <value>[email protected]</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>
xml xslt xslt-1.0
1个回答
0
投票

我找到了解决方案:

<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="*[translate(local-name(), $uppercase, $lowercase)='property']
        [not(*[translate(local-name(), $uppercase, $lowercase)='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>

如果有人可以更优雅地显示此内容,那么我会接受该答案。

© www.soinside.com 2019 - 2024. All rights reserved.