2013-07-12 6 views
1

XSLT를 사용하여 노드에 주석을 달지 않고 단일 노드에 주석을 달려면 어떻게해야합니까? 나는이 출력을 원하는단일 노드에 대한 설명

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

:

나는이 HTML을

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

노드가 복사되는 어린이와 주석 노드의 속성도 복사됩니다 열쇠입니다.

다음 내용은 최선을 다하지만 작동하지 않습니다. XSLT 프로세서가 꺼집니다. "텍스트, 주석, 파이 또는 하위 요소 노드가 이미 추가 된 후에 특성 및 네임 스페이스 노드를 부모 요소에 추가 할 수 없습니다."

<?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

관련 문제