2012-11-27 5 views
0

Я начинаю в XSLT. Я использую его для преобразования XML в XML.XSLT Укажите пространство имен в родительском узле

Источник XML:

<Response> 
    <Text>Hello</Text> 
</Response> 

XSLT:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:a="http://myexample.org/a" 
xmlns:b="http://myexample.org/b" 
version="1.0"> 

    <xsl:output method="xml" indent="yes" /> 

    <xsl:template match="Response" namespace="http://myexample.org/a"> 
     <xsl:element name="Root"> 
      <xsl:element name="a:Parent"> 
       <xsl:element name="b:Child"> 
        <xsl:value-of select="Text"/> 
       </xsl:element> 
      </xsl:element> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

Выход:

<Root> 
    <a:Parent xmlns:a="http://myexample.org/a"> 
    <b:Child xmlns:b="http://myexample.org/b">Hello</b:Child> 
    </a:Parent> 
</Root> 

Я хотел бы преобразование XML в формате XML с использованием XSLT.

Ожидаемое Outpout:

<Root xmlns:a="http://myexample.org/a"> 
    <a:Parent xmlns:b="http://myexample.org/b"> 
     <b:Child/> 
    </a:Parent> 
<Root> 

Я успешно создал XSLT для преобразования данных, но здесь я путать с пространствами имен. Я не могу сгенерировать его, как указано выше.

Пожалуйста, помогите. Благодарю.

+0

Сначала прочитайте это [Почему XSLT] (http://blog.marcocantu.com/blog/whyxslt.html) – vels4j

+0

@ vels4j: Я знаю, что он используется для преобразования XML в XML. Я также делаю то же самое, но здесь выходной XML должен иметь упомянутую структуру. Я обновил вопрос. Пожалуйста, дайте мне знать, если это имеет смысл. –

ответ

1

Это немного неудобно создавать объявление пространства имен в определенном месте с помощью XSLT 1.0 (это гораздо проще в 2.0, который имеет <xsl:namespace>), но это может быть сделано с помощью трюка, чтобы скопировать узлы пространства имен из стилей самого документа:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:a="http://myexample.org/a" 
xmlns:b="http://myexample.org/b" 
version="1.0"> 

    <xsl:output method="xml" indent="yes" /> 

    <xsl:template match="Response"> 
     <xsl:element name="Root"> 
      <xsl:copy-of select="document('')/*/namespace::a" /> 
      <xsl:element name="a:Parent"> 
       <xsl:copy-of select="document('')/*/namespace::b" /> 
       <xsl:element name="b:Child"> 
        <xsl:value-of select="Text"/> 
       </xsl:element> 
      </xsl:element> 
     </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

document('') анализирует документ таблицы стилей и дает его корневой узел, так document('')/* является <xsl:stylesheet> элементом. Затем мы извлекаем из этого элемента узел пространства имен , связанный с указанным префиксом, и копируем его в выходной документ.

В качестве альтернативы, вынимает объявление пространства имен из <xsl:stylesheet> и использовать буквенные элементы результата:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
version="1.0"> 

    <xsl:output method="xml" indent="yes" /> 

    <xsl:template match="Response"> 
     <Root xmlns:a="http://myexample.org/a"> 
      <a:Parent xmlns:b="http://myexample.org/b"> 
       <b:Child> 
        <xsl:value-of select="Text"/> 
       </b:Child> 
      </a:Parent> 
     </Root> 
    </xsl:template> 
</xsl:stylesheet> 

, хотя это не будет работать, если вам нужны a и b префиксы в другом месте в таблице стилей.