2013-07-12 6 views
1

Использование XSLT, как я могу прокомментировать один узел, не комментируя его дочерние элементы?Комментарий к одному узлу

У меня есть этот HTML:

<html> 
    <body> 
    <div class="blah" style="blahblah"> 
     <span> 
     <p>test</p> 
     </span> 
    </div> 
    </body> 
</html> 

Я хотел бы этот выход:

<html> 
    <body> 
    <!-- div class="blah" style="blahblah" --> 
     <span> 
     <p>test</p> 
     </span> 
    <!-- /div --> 
    </body> 
</html> 

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

Следующее - моя лучшая попытка, но не работает. Процессор XSLT кричит: «Узлы атрибутов и пространства имен не могут быть добавлены к родительскому элементу после добавления текста, комментария, узла pi или подэлемента».

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

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

    <xsl:template match="div"> 
     <xsl:text disable-output-escaping="yes">&lt;!--</xsl:text> 
     <xsl:copy> 
     <xsl:text disable-output-escaping="yes">--&gt;</xsl:text> 
      <xsl:apply-templates select="@* | node()"/> 
     <xsl:text disable-output-escaping="yes">&lt;!--</xsl:text> 
     </xsl:copy> 
     <xsl:text disable-output-escaping="yes">--&gt;</xsl:text> 
    </xsl:template> 

</xsl:stylesheet> 

ответ

0

Это довольно жуткое использование XSLT, но это, кажется, работает, и я не могу думать о более чистом подходе:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

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

    <xsl:template match="div"> 
    <xsl:text disable-output-escaping="yes">&lt;!--</xsl:text> 
    <xsl:copy> 
     <xsl:apply-templates select="@*"/> 
     <xsl:text disable-output-escaping="yes">--&gt;</xsl:text> 
     <xsl:apply-templates select="node()"/> 
     <xsl:text disable-output-escaping="yes">&lt;!--</xsl:text> 
    </xsl:copy> 
    <xsl:text disable-output-escaping="yes">--&gt;</xsl:text> 
    </xsl:template> 

</xsl:stylesheet> 
+0

Я не могу понять, почему вы не должны использовать '' , –

+0

Принимая этот ответ, потому что он короче, чем у Лего, и кажется более простым. – DaVinci007

+0

@torazaburo Я попробовал, но не смог заставить его работать. Кроме того, не создаст ли он плохую вложенность? – DaVinci007

1

Ее стоит отметить, что вы можете просто использовать <xsl:comment> для создания комментарии в выходном XML, не беспокоясь о их правильном закрытии. То, что вы сделали, может легко вызвать проблемы на линии, если ограничитель комментариев комментариев не был введен правильно.

Это будет делать трюк:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

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

    <xsl:template match="div"> 
     <xsl:comment> 
      <xsl:text> div </xsl:text> 
      <xsl:for-each select="@*"> 
       <xsl:value-of select="local-name()"/> 
       <xsl:text>="</xsl:text> 
       <xsl:value-of select="."/> 
       <xsl:text>" </xsl:text> 
      </xsl:for-each> 
     </xsl:comment> 
     <xsl:apply-templates select="./*" /> 
     <xsl:comment> /div </xsl:comment> 
    </xsl:template> 

</xsl:stylesheet> 

И когда выход довольно отпечатанных, он дает это:

<html> 
    <body> 
     <!-- div class="blah" style="blahblah" --> 
     <span> 
     <p>test</p> 
     </span> 
     <!-- /div --> 
    </body> 
</html> 
+0

Спасибо, Лего! Мне жаль, что я не смогу выбрать более одного ответа, поскольку ваш, кажется, обеспечивает более стандартный способ сделать это, учитывая его использование DaVinci007

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