2017-11-09 5 views
0

Ich möchte kommentieren, welche para, die 'para 1' enthält, wie die Eingabe zusammen mit den untergeordneten Elementen.xsl: Kommentar nicht alle untergeordneten Elemente anwenden?

INPUT:

<root> 
    <section> 
     <title>aaaa</title> 
     <para>para 1 <i>italic</i></para> 
    </section> 
    <section> 
     <title>aaaa</title> 
     <para>para 2</para> 
    </section> 
</root> 

XSLT:

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

<xsl:template match="para[contains(. , 'para 1')]"> 
    <xsl:comment> 
      <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
      </xsl:copy> 
     </xsl:comment> 
</xsl:template> 

OUTPUT:

<section> 
    <title>aaaa</title> 
    <!--para 1 italic--> 
</section> 

gewünschte Ausgangs alle Elemente kopiert werden sollen, wie es als Eingabe innerhalb Kommentar ist:

<section> 
    <title>aaaa</title> 
    <!--<para>para 1 <i>italic</i></para>--> 
</section> 

Antwort

0

Sie können damit umgehen mit disable-output-escaping

<xsl:template match="para[contains(. , 'para 1')]"> 
    <xsl:text disable-output-escaping="yes">&lt;!--</xsl:text> 
     <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    <xsl:text disable-output-escaping="yes">--&gt;</xsl:text> 
</xsl:template> 

<xsl:template match="comment()[parent::para[contains(. , 'para 1')]]"> 
    <xsl:text disable-output-escaping="yes">&lt;!- -</xsl:text> 
     <xsl:value-of select="."/> 
    <xsl:text disable-output-escaping="yes">- -&gt;</xsl:text> 
</xsl:template> 
+0

Dank @Rupesh. Ich habe diesen Weg gemacht, aber ich begegne einem neuen Szenario "Kommentar" bereits innerhalb von para in Eingabe. [d.h. para 1 kursiv]. Dann produziert es kein XML in wohlgeformter Form. –

+0

@Amrendra, aktualisierte Antwort. – Rupesh

0

Sie müssen das para Element serialisiert werden, dann können Sie die Markup in einem Kommentar setzen. Die Serialisierung wird in XSLT 3/XPath 3 unter Verwendung von Saxon 9.8 jede Ausgabe oder Altova 2017 R3 oder 2018 unter Verwendung der serialize Funktion unterstützt:

<xsl:template match="para[contains(. , 'para 1')]"> 
    <xsl:comment select="serialize(.)"/>   
</xsl:template> 

auf diese Weise eine Eingabe wie

<root> 
    <section> 
     <title>aaaa</title> 
     <para>para 1 <i>italic</i></para> 
    </section> 
    <section> 
     <title>aaaa</title> 
     <para>para 2</para> 
    </section> 
    <section> 
     <para>para 1 <i>italic</i> <!-- aa --> </para> 
    </section> 
</root> 

transformiert 9,8 in

also im Gegensatz zu der disable-output-Escape-Ansatz wird dies versuchen, Ihnen ein Ergebnis, das wohlgeformt ist. Ich bin mir derzeit jedoch nicht sicher, wie man ein Format erhält, das reparierbar wäre.

Verwandte Themen