2015-10-14 4 views
0

У меня сложное требование, когда мне нужно дублировать родительский узел и сделать его собственным родительским узлом. Теперь он станет дочерним узлом и будет иметь экранированные символы. Пожалуйста, смотрите пример ниже:XSL Дублировать родительский узел как собственный родительский узел

Образец:

<Messages> 
<Parameters> 
     <Field1>1</Field1> 
     <Field2>2</Field2> 
</Parameters> 
<Parameters> 
     <Field3>3</Field3> 
     <Field4>4</Field4> 
</Parameters> 
</Messages> 

Желаемая Выход:

<Messages> 
<Parameters> 
&lt;Parameters&gt; 
&lt;Field1&gt;1&lt;/Field1&gt; 
&lt;Field2&gt;2&lt;/Field2&gt; 
&lt;/Parameters&gt; 
</Parameters> 
<Parameters> 
&lt;Parameters&gt; 
&lt;Field3&gt;3&lt;/Field3&gt; 
&lt;Field4&gt;4&lt;/Field4&gt; 
&lt;/Parameters&gt; 
</Parameters> 
</Messages> 

возможно ли это? На самом деле у меня есть код XSL для экранирования символов благодаря другому ответу на форум stackoverflow. Я не уверен, как создать родительский узел.

Спасибо, ребята! С уважением, XSL Новичок

Мой код до сих пор:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:ns0="http://sap.com/xi/XI/SplitAndMerge"> 
    <xsl:template match="/"> 
    <ns0:Messages xmlns:ns0="http://sap.com/xi/XI/SplitAndMerge"> 
           <xsl:apply-templates/> 
    </ns0:Messages> 
    </xsl:template> 



<xsl:template match="*"> 
    <xsl:text disable-output-escaping="no">&lt;</xsl:text> 
    <xsl:value-of select="name()"/> 
    <xsl:apply-templates select="@*"/> 
    <xsl:text disable-output-escaping="no">&gt;</xsl:text> 
    <xsl:apply-templates select="node()"/> 
    <xsl:text disable-output-escaping="no">&lt;/</xsl:text> 
    <xsl:value-of select="name()"/> 
    <xsl:text disable-output-escaping="no">&gt;</xsl:text> 
</xsl:template> 

<xsl:template match="@*"> 
    <xsl:text disable-output-escaping="no">&#32;</xsl:text> 
    <xsl:value-of select="name()" disable-output-escaping="no"/> 
    <xsl:text disable-output-escaping="yes">=&amp;quot;</xsl:text> 
    <xsl:value-of select="." disable-output-escaping="no"/> 
    <xsl:text disable-output-escaping="yes">&amp;quot;</xsl:text> 
</xsl:template> 
<xsl:template match="text()"> 
    <xsl:value-of select="."/> 
</xsl:template> 

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

     </xsl:stylesheet> 
+0

Я добавил их в свой первоначальный пост. Спасибо за комментарий –

ответ

0

Я думаю, вы должны сначала проверить, поддерживает ли ваш процессор XSLT функцию расширения для сериализации дерева узлов XML, как правило, делает лучшую работу затем несколько шаблонов XSLT, сложенных вместе. Например, с процессором XSLT 3.0, как Saxon 9.6 вы можете просто использовать функцию serialize

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

    <xsl:variable name="ser-params"> 
     <output:serialization-parameters 
       xmlns:output="http://www.w3.org/2010/xslt-xquery-serialization"> 
      <output:method value="xml"/> 
      <output:version value="1.0"/> 
      <output:indent value="yes"/> 
      <output:omit-xml-declaration value="yes"/> 
     </output:serialization-parameters> 
    </xsl:variable> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="Parameters"> 
     <xsl:copy> 
      <xsl:value-of select="serialize(., $ser-params/*)"/> 
     </xsl:copy> 
    </xsl:template> 

</xsl:transform> 

Если вы хотите использовать свой подход, то использовать режимы, например,

<xsl:template match="Parameters"> 
    <xsl:copy> 
    <xsl:apply-templates select="." mode="serialize"/> 
    </xsl:copy> 
</xsl:template> 

, то ваши шаблоны для вывода сериализованной разметки должны определять и использовать режим, например.

<xsl:template match="*" mode="serialize"> 
    <xsl:text disable-output-escaping="no">&lt;</xsl:text> 
    <xsl:value-of select="name()"/> 
    <xsl:apply-templates select="@*"/> 
    <xsl:text disable-output-escaping="no">&gt;</xsl:text> 
    <xsl:apply-templates select="node()" mode="serialize"/> 
    <xsl:text disable-output-escaping="no">&lt;/</xsl:text> 
    <xsl:value-of select="name()"/> 
    <xsl:text disable-output-escaping="no">&gt;</xsl:text> 
</xsl:template> 

<xsl:template match="@*" mode="serialize"> 
    <xsl:text disable-output-escaping="no">&#32;</xsl:text> 
    <xsl:value-of select="name()" disable-output-escaping="no"/> 
    <xsl:text disable-output-escaping="yes">=&amp;quot;</xsl:text> 
    <xsl:value-of select="." disable-output-escaping="no"/> 
    <xsl:text disable-output-escaping="yes">&amp;quot;</xsl:text> 
</xsl:template> 

Дополнительные поправки могут быть необходимы, но вы использовали пространство имен в таблице стилей, не показывая в вашем образце XML, так что нельзя сказать, где необходимы поправки.

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