我想获取 XML 标记的属性值,使用 XSLT 1.0 时不区分大小写



我想在 XSLT1.0 中获取不区分大小写的 xml 属性值,或者我们可以说忽略大小写标签,例如,如果我们有一个标签

<Name></Name> or 
<name></name> or 
<nAME></nAME> etc

在每个场景中,我们的value-of select="name">都应该获取此 XML 标记的值。

<?xml version="1.0" encoding="UTF-8"?>
<CommandList>
<Name>Lufthansa-abc-def-Group-</Name>
<name>Lufthansa-abc-def-Group-</name>
<nAme>Lufthansa-abc-def-Group-</nAme>
<nAME>Lufthansa-abc-def-Group-</nAME>
</CommandList>

预期成果 :

汉莎航空-abc-def-集团-汉莎航空-abc-def-集团-汉莎航空-abc-def-集团-汉莎航空-abc-def-Group

试试这个

<xsl:for-each select="*[(translate(local-name(.), 'NAME', 'name')) = 'name']">
<xsl:value-of select="."/>
</xsl:for-each>

请参阅 https://xsltfiddle.liberty-development.net/gWEaSv6 的转型

@Michael Kay 我试过了,但没有得到结果?

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:template match="*">
<xsl:element name="translate(name(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')">
<xsl:apply-templates select="@*, node()" />
</xsl:element>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="translate(name(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')" select="." />
</xsl:template>
</xsl:stylesheet>

当你开始使用混乱的XML时,我的建议总是做一个两遍操作:首先把它变成干净的XML,然后做真正的处理。干净的XML绝对不会在标签中使用混合的大写和小写。

将所有内容转换为小写很容易:

<xsl:template match="*">
<xsl:element name="lower-case(name())">
<xsl:apply-templates select="@*, node()"/>
</xsl:element>
</xsl:template>
<xsl:template match="@*">
<xsl:attribute name="lower-case(name())" select="."/>
</xsl:template>

双通道方法的优点是第一阶段的代码是可重用的;无论后续处理如何,您都可以将其放入处理管道中。

最新更新