我正在使用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
等于email
或address
(不区分大小写)。
预期输出:
<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>
我找到了解决方案:
<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>
如果有人可以更优雅地显示此内容,那么我会接受该答案。