Преобразование 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 & 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 & 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="/"
как таковой, префикс используется только в квалифицированных именах.