2013-08-26 4 views
1

У меня есть входной XML, сказать:Спасаясь XML тег в XSLT

<myxml> 
    <myelement id="1" /> 
    <myelement id="2" /> 
    <myelement id="3" /> 
</myxml> 

Я хочу создать XSLT, который создает выходной XML в другой форме, скажем:

<theirxml> 
    <theirelement id="1" /> 
    <theirelement id="2" /> 
    <theirelement id="3" /> 
</theirxml> 

Поскольку I не может создать xslt с тегом внутри тега (например, что-то вроде «< theirelement id =» < xslt: ... > «>« Я нашел способ сделать это с CDATA следующим образом (представленная только соответствующая часть xslt):

<xsl:for-each select="myxml/myelement"> 
    <xsl:text><![CDATA[<theirelement id="]]></xsl:text><xsl:value-of select="@name" /><xsl:text><![CDATA[" />]]></xsl:text> 
</xsl:for-each> 

Однако полученный вывод не содержит "< theirelement ...", а "& л; theirelement ...". Мне нужен вывод, чтобы фактически содержать «<», а не «& lt;» (то же самое относится к «>» и «&»;).

Причина в том, что выход из этого процесса является входом для некоторой программы, которая не считывает xml, когда теги экранируются как «& lt; tag & gt.».

Любая помощь была бы принята с благодарностью!

ответ

2

Вот таблица стилей, что делает требуемое преобразование:

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

    <xsl:output encoding="utf-8" method="xml"/> 

    <xsl:template match="/"> 
     <myxml> 
      <xsl:apply-templates/> 
     </myxml> 
    </xsl:template> 

    <xsl:template match="myelement"> 
     <theirelement> 
      <xsl:attribute name="id"><xsl:value-of select="@id"/></xsl:attribute> 
     </theirelement> 
    </xsl:template> 

</xsl:stylesheet> 
1

Решение от @ fred02138 может быть упрощено до:

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

    <xsl:output encoding="utf-8" method="xml"/> 

    <xsl:template match="/"> 
     <myxml> 
      <xsl:apply-templates/> 
     </myxml> 
    </xsl:template> 

    <xsl:template match="myelement"> 
     <theirelement id="{@id}"/> 
    </xsl:template> 

</xsl:stylesheet> 

Конструкция в фигурных скобках представляет собой «шаблон значения атрибута» , в случае, если вы хотите найти его в XSLT-ссылке.

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