Как написать XSL, используя пространство имен по умолчанию? - PullRequest
0 голосов
/ 01 апреля 2011

Допустим, у меня есть XML-файл, который выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>

<Project xmlns="http://My/Project.xsd">
    <Thing Name="test"/>
</Project>

И мой XSLT:

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:xdt="http://www.w3.org/2005/xpath-datatypes" xmlns="http://My/Project.xsd">
    <xsl:output method="text" version="1.0" encoding="UTF-8" indent="no"/>

    <xsl:template match="Thing">
        <xsl:value-of select="@Name"/>
    </xsl:template>
</xsl:stylesheet>

Вывод [NewLine][Tab][NewLine], который соответствует интервалу XMLфайл.

Если я изменю свой XSLT на: (добавлен префикс)

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:xdt="http://www.w3.org/2005/xpath-datatypes" xmlns:N="http://My/Project.xsd">
    <xsl:output method="text" version="1.0" encoding="UTF-8" indent="no"/>

    <xsl:template match="N:Thing">
        <xsl:value-of select="@Name"/>
    </xsl:template>
</xsl:stylesheet>

Вывод [NewLine][Tab]test[NewLine], который снова совпадает с интервалом файла XML, но включает значениеатрибут «Имя».

Мой ожидаемый вывод - просто test.Никаких новых строк, никаких вкладок - он вообще не должен соответствовать формату XML-файла.

Я хочу писать XML и XSLT без использования префиксов.Как я могу сделать этот вывод, что я ожидаю?

1 Ответ

3 голосов
/ 01 апреля 2011

Здесь есть две проблемы: во-первых, вы не хотите указывать префикс пространства имен, а во-вторых, вы не хотите, чтобы в исходном документе были пробелы, влияющие на ваш вывод. Давайте обсудим их отдельно.

Использование префикса пространства имен: Краткий ответ - нет - вы не можете написать шаблон XSL, который соответствует элементам в определенном пространстве имен без указания такого пространства имен с помощью префикса. В вашем первом XSLT вы могли прочитать определение шаблона, например «Я хочу выбрать узел с именем Thing, у которого нет пространства имен » , тогда как вы действительно хотите сказать: » Я хочу выбрать узел с именем Thing, который имеет пространство имен http://My/Project.xsd". Так работает спецификация XPath 1.0 (подробнее см. в этой статье ).

Избавление от интервала: Используйте инструкцию <xsl:strip-space elements="*"/> в начале таблицы стилей, чтобы указать, что вы не хотите, чтобы пробелы из всех исходных элементов сохранялись в выходном документе. Если вы хотите сохранить некоторые из них, используйте также <xsl:preserve-spaces elements="myNode">.

...