Определения объявленных пространств имен, появляющиеся в выводе XSL - PullRequest
0 голосов
/ 17 июня 2020

У меня есть следующее XML:

<?xml version="1.0" encoding="utf-8"?>
<e:export xmlns="http://docbook.org/ns/docbook" 
    xmlns:e="http://ns.expertinfo.se/cms/xmlns/export/1.0" 
    xmlns:xinfo="http://ns.expertinfo.se/cms/xmlns/1.0">
    <e:resource id="31750" uuid="UUID-df90c0cb-f3ad-ee14-9123-02e25dedcc21" title="custom-dashboard-widget-displayed.png" />
</e:export>

У меня есть следующее преобразование - обратите внимание на определение пространства имен xinfo:

<?xml version="1.0"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 

    xmlns:xinfo="http://ns.expertinfo.se/cms/xmlns/1.0"
    xmlns:e="http://ns.expertinfo.se/cms/xmlns/export/1.0"  version="2.0" exclude-result-prefixes="e" >
    <xsl:output indent="yes" method="xml" omit-xml-declaration="no" exclude-result-prefixes="xinfo e"/>

    <xsl:template match="/">
        <xsl:apply-templates select="//e:resource" />

    </xsl:template>
    <xsl:template match="e:resource">
         <mediaobject xinfo:version="4.0;4.1;4.2">
            <imageobject>
                <imagedata>
                    <xsl:attribute name="fileref"><xsl:value-of select="./@uuid"/></xsl:attribute>
                    <xsl:attribute name="contentwidth">1014</xsl:attribute>
                    <xsl:attribute name="xinfo:image"><xsl:value-of select="./@uuid"/></xsl:attribute>
                </imagedata>
            </imageobject>
        </mediaobject>
    </xsl:template>

</xsl:transform>

Это то, что я хочу - несколько атрибутов с пространством имен xinfo.

<mediaobject xinfo:version="4.0;4.1;4.2">
    <imageobject>
        <imagedata fileref="UUID-af013f1c-dad0-7c4b-e7df-81c3b79d55d5" contentwidth="1014" xinfo:image="UUID-af013f1c-dad0-7c4b-e7df-81c3b79d55d5"/>
    </imageobject>
</mediaobject>

Это то, что я получаю - определение пространства имен xinfo, которое было объявлено ранее:

<mediaobject xmlns:xinfo="http://ns.expertinfo.se/cms/xmlns/1.0"
             xinfo:version="4.0;4.1;4.2">
   <imageobject>
      <imagedata fileref="UUID-af013f1c-dad0-7c4b-e7df-81c3b79d55d5"
                 contentwidth="1014"
                 xinfo:image="UUID-af013f1c-dad0-7c4b-e7df-81c3b79d55d5"/>
   </imageobject>
</mediaobject>

Как вывести пространство имен атрибута xinfo без его повторного определения?

Ответы [ 2 ]

0 голосов
/ 17 июня 2020

Действительно, то, что я хотел, - это не то, что возможно. Бывает, чаще, чем хочется.

Я переписал преобразование, чтобы связать пространство имен с URL-адресом.

Спасибо michael.hor257k за указание на это в комментарии :

Требуемый вывод не является правильно сформированным XML документом. Вы не можете использовать префикс, не привязывая его к пространству имен. Никакой XSLT-процессор не даст такого результата.

0 голосов
/ 17 июня 2020

Я думаю, вам нужно будет специально исключить пространства имен, которые вам не нужны в вашем выводе, с помощью инструкции exclude-result-prefixes .

Пример:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:xinfo="http://ns.expertinfo.se/cms/xmlns/1.0"
  xmlns:e="http://ns.expertinfo.se/cms/xmlns/export/1.0"
  exclude-result-prefixes="xinfo e">
  ...
</xsl:stylesheet>
...