具有 XSL 转换的 XML 中的非敏感筛选器节点的大小写



我正在使用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节点。

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

预期产出:

<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>

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

最新更新