2017-09-15 3 views
0

Comment puis-je empêcher le comportement par défaut de XSLT de sortir tous les éléments? Simplement dit, je veux ignorer tous les éléments qui ne correspondent pas à mon modèle.XSLT 1.0: ignorer tous les éléments sans correspondance du modèle

J'ai le code XML suivant:

<?xml version="1.0" encoding="UTF-8"?> 
<SDHttpMessage> 
<Headers> 
    <Parameter name="Type">text/xml;charset=UTF-8</Parameter> 
</Headers> 
<Charset>UTF-8</Charset> 
<Message> 
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
     <soapenv:Body> 
      <Content> 
       <MyContent> 
        <A>Text A</A> 
        <B>Text B</B> 
        <C>Text C</C> 
       </MyContent> 
      </Content> 
     </soapenv:Body> 
    </soapenv:Envelope> 
</Message> 

Et XSLT suivante:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" 
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
      xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      exclude-result-prefixes="soapenv xsd xsi"> 

<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 
<xsl:strip-space elements="*" /> 

<xsl:template match="Content/MyContent"> 
    <A><xsl:value-of select="A" /></A> 
    <B><xsl:value-of select="B" /></B> 
    <C><xsl:value-of select="C" /></C> 
</xsl:template> 

sortie souhaitée:

<A>Text A</A> 
<B>Text B</B> 
<C>Text C</C> 

sortie actuelle:

text/xml;charset=UTF-8UTF-8 
<A>Text A</A> 
<B>Text B</B> 
<C>Text C</C> 

Je pensais simplement appeler mon modèle à l'intérieur d'un modèle-élément racine:

<xsl:template match="/"> 
    <xsl:call-template name="callMyTemplate" /> 
</xsl:template> 

<xsl:template match="Content/MyContent" name="callMyTemplate"> 
    <A><xsl:value-of select="A" /></A> 
    <B><xsl:value-of select="B" /></B> 
    <C><xsl:value-of select="C" /></C> 
</xsl:template> 

Mais il ne correspond à aucun des éléments alors.

Alors quelle serait la meilleure approche si je veux juste ignorer tous les éléments inégalés?

Merci d'avance.

+0

Etes-vous sûr de vouloir générer un fragment XML sans élément racine? –

+0

Merci pour la remarque, je voulais juste garder l'échantillon aussi basique que possible – CoffeeCups

Répondre

1

Vous pouvez ajouter un modèle pour contourner les autres branches:

<xsl:template match="/SDHttpMessage"> 
    <xsl:apply-templates select="Message/soapenv:Envelope/soapenv:Body/Content/MyContent"/> 
</xsl:template> 

ou remplacer le haut-en modèle:

<xsl:template match="text()"/> 

Ou vous pouvez simplement:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
exclude-result-prefixes="soapenv"> 
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 
<xsl:strip-space elements="*" /> 

<xsl:template match="/SDHttpMessage"> 
    <xsl:for-each select="Message/soapenv:Envelope/soapenv:Body/Content/MyContent/*"> 
     <xsl:element name="{name()}"> 
      <xsl:value-of select="." /> 
     </xsl:element> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet>