2017-09-14 2 views
0

J'utilise XSLT1.0 pour transformer du XML en un autre XML. Juste besoin de faire un peu de traitement du contenu.XSL Transformer les commentaires

L'entrée XML a des commentaires qui se trouvent dans une forme d'entité de charateur développée. J'en aurais besoin pour le faire comme un commentaire régulier.

l'entrée est comme ci-dessous,

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN" "concept.dtd">

<concept id="test">
<title>Test title</title>
<conbody>&lt;!-- test comments--&gt;

<p>test paragraph &lt;!-- comments in p --&gt;</p>

</conbody>
</concept>

Le commentaire de sortie nécessaire devrait être comme ci-dessous,

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN" "concept.dtd">

<concept id="test">
<title>Test title</title>
<conbody><!-- test comments-->

<p>test paragraph <!-- comments in p --></p>

</conbody>
</concept>

Le commentaire devrait en fait venir comme ci-dessus. Mais je ne suis pas sûr qu'il soit possible de le faire en XSLT.

Quelqu'un peut-il aider à ce sujet?

+0

Le code est Gpn008

+0

Bien savez-vous que les éléments' test' contiennent toujours un tel commentaire et rien d'autre? –

Répondre

0

- édité en réponse à la clarification -

Peut-être il pourrait être aussi simple que cela:

XSLT 1,0

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

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

<xsl:template match="text()"> 
    <xsl:value-of select="." disable-output-escaping="yes"/> 
</xsl:template> 

</xsl:stylesheet> 

Cela suppose votre soutien de la chaîne de traitement BICHE.

Il est également supposé que votre XML ne porte pas d'autres balisages échappés qui ne devraient pas être échappés. Si ce n'est pas une hypothèse sûre, utilisez:

<xsl:template match="text()" name="unescape-comments"> 
    <xsl:param name="text" select="."/> 
    <xsl:choose> 
     <xsl:when test="contains($text, '&lt;!--')"> 
      <xsl:value-of select="substring-before($text, '&lt;!--')"/> 
      <xsl:comment> 
       <xsl:value-of select="substring-before(substring-after($text, '&lt;!--'), '--&gt;')"/> 
      </xsl:comment> 
      <xsl:call-template name="unescape-comments"> 
       <xsl:with-param name="text" select="substring-after($text, '--&gt;')"/> 
      </xsl:call-template> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="$text"/> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 
+0

Merci pour la réponse.Mais en réalité le commentaire peut venir n'importe où dans n'importe quel élément. De plus, l'élément parent peut contenir un autre texte de plan ou même des sous-éléments. Le but principal du Xslt est donc de garder le même contenu en prenant soin des commentaires. L'entrée XML est générée à partir d'un script qui rend les commentaires invalides. Essayer de rendre le XML valide en utilisant XSLT. – Gpn008

+0

Veuillez éditer votre question et montrer un exemple ** représentatif ** de l'entrée et de la sortie attendue. –

+0

Modification de la question avec l'entrée d'échantillon et la sortie attendue – Gpn008