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

i want to obtain a attribute's value of an xml tag, which would be case insensitive using 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>

预期结果: Lufthansa-abc-def-Group-Lufthansa-abc-def-Group-Lufthansa-abc-def-Group-Lufthansa-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

查看转换

当你从混乱开始时 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>

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

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