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
等于 email
或 address
(不区分大小写)。
预期输出:
<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>
如果有人能更优雅地展示这个,那么我会接受这个答案。
我正在使用 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
等于 email
或 address
(不区分大小写)。
预期输出:
<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>
如果有人能更优雅地展示这个,那么我会接受这个答案。