я хочу получить значение атрибута тега xml, который не чувствителен к регистру при использовании XSLT 1.0 - PullRequest
0 голосов
/ 30 января 2020

Я хочу получить значение xml атрибута в XSLT1.0, который не учитывает регистр, или мы можем сказать, игнорируется регистр тегов, например, если у нас есть тег

 <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-ab c -def-Group-Lufthansa-ab c -def-Group-Lufthansa-ab c -def-Group-Lufthansa-ab c -def-Group

Ответы [ 3 ]

0 голосов
/ 30 января 2020

Когда вы начинаете с грязного 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>

Преимущество двухпроходного подхода заключается в том, что что код для первого этапа можно использовать повторно; вы можете поместить его в свой конвейер обработки, какой бы ни была последующая обработка.

0 голосов
/ 30 января 2020

@ Майкл Кей, я пробовал, но не получил результат?

<?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>
0 голосов
/ 30 января 2020

Попробуйте это

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

см. Преобразование в https://xsltfiddle.liberty-development.net/gWEaSv6

...