2012-04-02 2 views
0

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

У меня есть элементы, создаваемые ОК. У меня просто возникают проблемы с правильной ведением пространств имен.

Проблема в том, что каждое отдельное пространство имен в области текущего элемента выводится для каждого отдельного элемента. Я просто хочу выводить пространства имен, поскольку они сначала объявлены в исходном XML.

Это то, что я в настоящее время пытаюсь сделать, я пробовал несколько вещей и не могу найти способ сделать то, что мне нужно.

Я называю шаблон, который отвечает за преобразование атрибутов для текущего узла с:

<xsl:call-template name="elementAttributes"> 
     <xsl:with-param name="element" select="."/> 
</xsl:call-template> 

С следующим шаблоном:

<xsl:template name="elementAttributes"> 
     <xsl:param name="element"/> 
     <xsl:for-each select="$element/namespace::*"> 
      <!--dont include default namespace--> 
      <xsl:if test="boolean(name())"> 
       <xsl:text> </xsl:text> 
       <xsl:value-of select="name()"/> 
       <xsl:text>='</xsl:text> 
       <xsl:value-of select="."/> 
       <xsl:text>'</xsl:text> 
      </xsl:if> 
     </xsl:for-each> 
</xsl:template> 

Так, например с XML:

<valueString> 
     <dms:animal xmlns:dms="http://test.net/2012/dms/"> 
      <dms:dog>woof</dms:dog> 
      <dms:cat>meow</dms:cat> 
      <reptile:crocodile xmlns:reptile="http://reptile.test.net/2012/dms/"></reptile:crocodile> 
     </dms:animal> 
</valueString> 

Я заканчиваю:

<dms:animal dcds='http://purl.org/dc/xmlns/2008/09/01/dc-ds-xml/' dms='http://test.net/2012/dms/' ns0='http://purl.org/dc/xmlns/2008/09/01/dc-ds-xml/' xml='http://www.w3.org/XML/1998/namespace'> 
<dms:dog dcds='http://purl.org/dc/xmlns/2008/09/01/dc-ds-xml/' dms='http://test.net/2012/dms/' ns0='http://purl.org/dc/xmlns/2008/09/01/dc-ds-xml/' xml='http://www.w3.org/XML/1998/namespace'>woof</dms:dog> 
<dms:cat dcds='http://purl.org/dc/xmlns/2008/09/01/dc-ds-xml/' dms='http://test.net/2012/dms/' ns0='http://purl.org/dc/xmlns/2008/09/01/dc-ds-xml/' xml='http://www.w3.org/XML/1998/namespace'>meow</dms:cat> 
<reptile:crocodile dcds='http://purl.org/dc/xmlns/2008/09/01/dc-ds-xml/' dms='http://test.net/2012/dms/' ns0='http://purl.org/dc/xmlns/2008/09/01/dc-ds-xml/' reptile='http://reptile.test.net/2012/dms/' xml='http://www.w3.org/XML/1998/namespace'/> 

, когда я только в основном хотят получить обратно тот же XML.

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

+1

Майкл Кей прав. Посмотрите на код моего XPath Visualizer, чтобы посмотреть, как это делается: http://www.huttar.net/dimitre/XPV/TopXML-XPV.html –

ответ

1

Я бы сказал, что то, что вы пытаетесь сделать, - довольно странный дизайн. Все мои инстинкты должны вернуться к этапу требований и посмотреть, будет ли другой дизайн более разумным.

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