2013-07-17 2 views
2

XMLСохранение комментариев XML во XSL Transformations

<?xml-stylesheet type="text/xsl" href="script.xsl"?> 
<elements> 
    <stack> 
    <name>Ray</name> 
    <status>0</status> 
    </stack> 
<!-- Comment 1 --> 
    <things> 
    <!-- Comment 2 --> 
    <thing> 
     <color>red</color> 
     <!-- State Comment --> 
     <state>solid</state> 
     <!-- Weight Comment --> 
     <weight>45</weight> 
     <unit>34</unit> 
     <!-- Comment 3 --> 
    </thing> 
</things> 
<favs> 
    <stick>ready</stick> 
    <!-- Comment 4--> 
</favs> 
</elements> 

ОЖИДАЕТСЯ ВЫХОД

<elements> 
    <stack> 
    <name>Ray</name> 
    <status>0</status> 
    </stack> 
    <!-- Comment 1 --> 
    <mainElements> 
    <!-- Comment 2 --> 
    <specialThing> 
     <!-- Weight Comment --> 
     <PropertyOne>45</PropertyOne> 
     <PropertyTwo>red</PropertyTwo> 
     <!-- State Comment --> 
     <PropertyThree>solid</PropertyThree> 
    </specialThing> 
    <!-- Comment 3 --> 
    </mainElements> 
<favs> 
    <stick>ready</stick> 
    <!-- Comment 4--> 
</favs> 
</elements> 

ТОКА XSL

<?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="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
</xsl:template> 


<xsl:template match="things"> 
     <mainElements> 
      <xsl:apply-templates select="thing"/> 
     </mainElements> 
    </xsl:template> 


<xsl:template match="thing"> 
    <specialThing> 
     <xsl:apply-templates select="weight"/> 
    <xsl:apply-templates select="color"/> 
    <xsl:apply-templates select="state"/> 
     </specialThing> 
</xsl:template> 


<xsl:template match="weight"> 
    <PropertyOne> 
     <xsl:value-of select="."/> 
     </PropertyOne> 
</xsl:template> 

<xsl:template match="color"> 
    <PropertyTwo> 
     <xsl:value-of select="."/> 
     </PropertyTwo> 
</xsl:template> 

<xsl:template match="state"> 
    <PropertyThree> 
     <xsl:value-of select="."/> 
     </PropertyThree> 
</xsl:template> 
</xsl:stylesheet> 

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

например: тег с именем weight переименовывается в «PropertyOne», и значение также сохраняется на выходе. Но комментарий выше того же отсутствует. Я хочу также оставить комментарий на выходе. Как я могу это достичь?

ответ

1

Вам необходимо сделать xsl:apply-templates для предыдущего брата comment(). Поскольку вы меняете порядок weight/color/state, вам нужно добавить его к каждому из своих шаблонов.

Кроме того, соответствие Comment 3 сложно, и то, что я сделал, может не работать для ваших фактических данных.

XML Input

<elements> 
    <stack> 
     <name>Ray</name> 
     <status>0</status> 
    </stack> 
    <!-- Comment 1 --> 
    <things> 
     <!-- Comment 2 --> 
     <thing> 
      <color>red</color> 
      <!-- State Comment --> 
      <state>solid</state> 
      <!-- Weight Comment 1 --> 
      <!-- Weight Comment 2 --> 
      <weight>45</weight> 
      <unit>34</unit> 
      <!-- Comment 3 --> 
     </thing> 
    </things> 
    <favs> 
     <stick>ready</stick> 
     <!-- Comment 4--> 
    </favs> 
</elements> 

XSLT 1,0

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

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


    <xsl:template match="things"> 
     <mainElements> 
      <xsl:apply-templates select="thing|comment()"/> 
     </mainElements> 
    </xsl:template> 


    <xsl:template match="thing"> 
     <specialThing> 
      <xsl:apply-templates select="weight"/> 
      <xsl:apply-templates select="color"/> 
      <xsl:apply-templates select="state"/>   
     </specialThing> 
     <xsl:apply-templates select="comment()[not(following-sibling::*)]"/> 
    </xsl:template> 


    <xsl:template match="weight"> 
     <xsl:apply-templates select="preceding-sibling::comment()[generate-id(following-sibling::*[1])=generate-id(current())]"/> 
     <PropertyOne> 
      <xsl:value-of select="."/> 
     </PropertyOne> 
    </xsl:template> 

    <xsl:template match="color"> 
     <xsl:apply-templates select="preceding-sibling::comment()[generate-id(following-sibling::*[1])=generate-id(current())]"/> 
     <PropertyTwo> 
      <xsl:value-of select="."/> 
     </PropertyTwo> 
    </xsl:template> 

    <xsl:template match="state"> 
     <xsl:apply-templates select="preceding-sibling::comment()[generate-id(following-sibling::*[1])=generate-id(current())]"/> 
     <PropertyThree> 
      <xsl:value-of select="."/> 
     </PropertyThree> 
    </xsl:template> 

</xsl:stylesheet> 

XML Output

<elements> 
    <stack> 
     <name>Ray</name> 
     <status>0</status> 
    </stack> 
    <!-- Comment 1 --> 
    <mainElements> 
     <!-- Comment 2 --> 
     <specialThing> 
      <!-- Weight Comment 1 --> 
      <!-- Weight Comment 2 --> 
      <PropertyOne>45</PropertyOne> 
      <PropertyTwo>red</PropertyTwo> 
      <!-- State Comment --> 
      <PropertyThree>solid</PropertyThree> 
     </specialThing> 
     <!-- Comment 3 --> 
    </mainElements> 
    <favs> 
     <stick>ready</stick> 
     <!-- Comment 4--> 
    </favs> 
</elements> 
+1

я предлагаю изменение 'предшествующее-родственный :: комментарий() [1] 't o 'previous-sibling :: node() [1] [self :: comment()]' или 'previous-sibling :: comment() [count (follow-sibling :: * [1] | current()) = 1] ', чтобы предотвратить случайное захват шаблонов комментариями другого элемента. – JLRishe

+0

@ Daniel Большое спасибо :) –

+0

@JLRishie Thanx для подсказки bro :) :) –

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