Как добавить декларацию CSS в документ XML с использованием XSLT? - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть много XML-файлов, которые я хочу обработать с помощью XSLT. Я хочу, чтобы результат включал пользовательский CSS для отображения файлов в режиме автора Oxygen.

Введите:

<?xml version="1.0" encoding="utf-8"?>
<alto xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.loc.gov/standards/alto/ns-v2# http://www.loc.gov/standards/alto/alto-v2.0.xsd" xmlns="http://www.loc.gov/standards/alto/ns-v2#">
<!—more XML-->
</alto>

XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xpath-default-namespace="http://www.loc.gov/standards/alto/ns-v2#"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <!—A series of templates that transform the XML-->

</xsl:stylesheet>

Желаемый вывод:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="my-style.css"?>
<alto xmlns:xlink="http://www.w3.org/1999/xlink"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns="http://www.loc.gov/standards/alto/ns-v2#"
      xsi:schemaLocation="http://www.loc.gov/standards/alto/ns-v2# http://www.loc.gov/standards/alto/alto-v2.0.xsd">
<!—more XML-->
</alto>

Что мне нужно добавить в мою таблицу стилей, чтобы объявление отображалось в каждом файле XML?

Ответы [ 2 ]

1 голос
/ 23 апреля 2019

Используйте инструкцию xsl:processing-instruction.
Чтобы ваша таблица стилей могла выглядеть следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xpath-default-namespace="http://www.loc.gov/standards/alto/ns-v2#"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/">
        <xsl:processing-instruction name="xml-stylesheet">href="my-style.css"</xsl:processing-instruction>
        <xsl:apply-templates select="node()|@*" />
    </xsl:template>

    <!-- Identity template -->
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*" />
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

Вывод:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="my-style.css"?>
<alto xmlns:xlink="http://www.w3.org/1999/xlink"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns="http://www.loc.gov/standards/alto/ns-v2#"
      xsi:schemaLocation="http://www.loc.gov/standards/alto/ns-v2# http://www.loc.gov/standards/alto/alto-v2.0.xsd"/>
0 голосов
/ 23 апреля 2019

Добавьте

<xsl:template match="/">
  <xsl:processing-instruction name="xml-stylesheet">href="my-style.css"</xsl:processing-instruction>
  <xsl:next-match/>
</xsl:template>

в конце таблицы стилей или убедитесь, что вы отредактировали шаблон для match="/" и вставили туда <xsl:processing-instruction name="xml-stylesheet">href="my-style.css"</xsl:processing-instruction>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...