Преобразование xml в xsl с пространством имен

Я использую IE 11 и Firefox для тестирования

следующее работает нормально:

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="LEDES21Basic.xslt" type="text/xsl"?>
<ledesxml>
  <firm>
      <lf_vendor_id>GB 12 345 6789</lf_vendor_id>
      <lf_id>FR12-3456789</lf_id>
      <lf_name>Alpha &amp; Beta, LLC</lf_name>
</firm>
</ledesxml>

со следующей таблицей стилей

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" 
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:t="http://www.ledes.org/ledes2000.xsd"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
    <xsl:output method="html" indent="yes"/>

    <xsl:template match="/">
        <html>
            <head>
                <title>Acounting document</title>            
            </head>
          <body>        
              <p>BODY</p>
              <xsl:value-of select="/ledesxml/firm/lf_name"/>
          </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

но мой настоящий XML-файл:

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="LEDES21Basic.xslt" type="text/xsl"?>
<ledesxml xmlns="http://www.ledes.org/ledes2000.xsd">
  <firm>
    <lf_vendor_id>GB 12 345 6789</lf_vendor_id>
    <lf_id>FR12-3456789</lf_id>
    <lf_name>Alpha &amp; Beta, LLC</lf_name>
  </firm>
</ledesxml>

Вы отмечаете пространство имен. предыдущая таблица стилей не может преобразовать XML. Я пробую две вещи: меняя выражение xpath, использую атрибут xpath-default-namespace:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" 
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:t="http://www.ledes.org/ledes2000.xsd"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
    <xsl:output method="html" indent="yes"/>

    <xsl:template match="t:/">
        <html>
            <head>
                <title>Acounting document</title>            
            </head>
          <body>        
              <p>BODY</p>
              <xsl:value-of select="t:/ledesxml/firm/lf_name"/>
          </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

оба они терпят неудачу. Firefox говорит: ошибка анализа выражения xpath.

==== следующая попытка ================================================== ============

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" 
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:t="http://www.ledes.org/ledes2000.xsd"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
    <xsl:output method="html" indent="yes"/>

    <xsl:template match="/">
        <html>
            <head>
                <title>Acounting document</title>            
            </head>
          <body>        
              <p>BODY</p>
              <xsl:value-of select="/t:ledesxml/t:firm/t:lf_name"/>
          </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

больше нет ошибки xpath, но нет ожидаемого результата: lf_name не преобразуется.

Что я могу сделать, чтобы преобразовать мой XML-файл, не удаляя пространство имен?

1 ответ

Решение

xpath-default-namespace работает только с процессорами XSLT 2.0, такими как Saxon 9, Saxon CE, XmlPrime, Altova, браузеры поддерживают только XSLT 1.0. Что касается использования префикса, то да, это правильный подход, но правильный синтаксис - это префикс любого имени элемента, как в <xsl:value-of select="/t:ledesxml/t:firm/t:lf_name"/>, И уходи match="/" как таковой, префикс используется только в квалифицированных именах.

Другие вопросы по тегам