2016-01-12 3 views
0

Есть ли подход, который собирает префикс: local-name элемента с помощью URN и локального имени?Как извлечь префикс из URI?

Например, используя этот код:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xstible:1.0" version="1.0"> 
    <xsl:template match="/"> 
     <root> 
     <xsl:element name="element" namespace="urn:oasis:names:tc:opendocument:xmlns:xstible:1.0"> 
      <nested-element>Some text...</nested-element> 
     </xsl:element> 
     </root> 
    </xsl:template> 
</xsl:stylesheet> 

Что я получаю в результате это:

<root xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xstible:1.0"> 
    <element xmlns="urn:oasis:names:tc:opendocument:xmlns:xstible:1.0"> 
     <nested-element xmlns="">Some text...</nested-element> 
    </element> 
</root> 

То, что я хочу, как результат:

<root xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xstible:1.0"> 
    <fo:element> 
     <nested-element>Some text...</nested-element> 
    </fo:element> 
</root> 

Предоставление URI для элемент xsl: имя, которое должно быть магически префиксным (с префиксом, соответствующим этому URI - объявленному в корневом элементе ement), а URI отсутствует в результирующем документе. Надеюсь, вы понимаете, чего я пытаюсь достичь :)

+0

В вашем желаемом результате элемент 'inested-element' находится в no-namespace. Вы уверены, что это то, что вы хотите? –

+0

Да. Я использую литерал для моего корневого элемента, чтобы он мог хранить все объявления пространства имен. – Hairi

+0

ОК. Я не думаю, что вы можете сказать, что ваш XSLT-процессор автоматически добавляет префикс так, как вы описываете. Возможно, вы могли бы сделать это за два прохода и обработать незакрепленные элементы на втором проходе. В любом случае результаты семантически идентичны, поэтому нет веских оснований тратить на это какие-либо усилия. –

ответ

0

Предполагаю, что у вас есть причина явно использовать <xsl:element />, а не просто объявлять элемент <fo:element> напрямую.

XSLT 1.0 specification позволяет использовать атрибут <xsl:element />@nameto be a qname. Таким образом, вы можете повторно использовать уже объявленную пространство имен, предваряя его префикс к элементу @name обычным способом:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xstible:1.0" 
    version="1.0"> 

    <xsl:output indent="yes"/> 

    <xsl:template match="/"> 
     <root> 
      <xsl:element name="fo:element"> 
       <nested-element>Some text...</nested-element> 
      </xsl:element> 
     </root> 
    </xsl:template> 
</xsl:stylesheet> 

XSLT 1.0 процессор будет безопасно проверить, что приставка была объявлена.

Код испытания в Саксонии 6.5.5.

Смежные вопросы