2010-07-07 4 views
0

Je veux sauter l'élément enfant de suivre xmlXSL Skipping enfant élément

<person id="101"> 
    <name>XYZ</name> 
    <last-name>XXX</last-name> 
</person> 
<person id="101"> 
    <name>YYY</name> 
    <last-name>BBB</last-name> 
</person> 

En supposant que je veux passer la dernière nom et voici mon code

<xsl:template match="/"> 
    <xsl:apply-templates select="//person [not(last-name)]" /> 
</xsl:template> 
<xsl:template match="person"> 
<xsl:copy-of select="." /> 
<xsl:text>&#xa;</xsl:text> 
</xsl:template> 

Le code ci-dessus saute le tout élément de personne qui a un élément de nom de famille.

Quelqu'un peut-il m'aider avec ce code?

Merci

Répondre

1

Avec l'entrée correcte:

<root> 
    <person id="101"> 
     <name>XYZ</name> 
     <last-name>XXX</last-name> 
    </person> 
    <person id="101"> 
     <name>YYY</name> 
     <last-name>BBB</last-name> 
    </person> 
</root> 

Cette feuille de style:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="@*|node()"> 
<xsl:copy> 
    <xsl:apply-templates select="@*|node()" /> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="last-name"/> 
</xsl:stylesheet> 

Produire ce que je pense est le résultat souhaité:

<root> 
    <person id="101"> 
     <name>XYZ</name> 
    </person> 
    <person id="101"> 
     <name>YYY</name> 
    </person> 
</root> 

Remarque: transformation d'identité. Modèle vide pour dénuder les nœuds.

+0

Merci. Travaillé parfait! – Maximus

+0

@ jason4: Vous êtes bienvenu! Aussi, afin d'aider les autres, veuillez éditer votre question et indiquer clairement que vous voulez supprimer l'élément 'last-name'. –

1

par « sauter nom » Je suppose que vous voulez que votre sortie à ressembler à ceci:

<person id="101"> 
    <name>XYZ</name> 
</person> 
<person id="101"> 
    <name>YYY</name> 
</person> 

Dans ce cas, votre approche devra inclure tous les éléments person. Une manière standard de copier tout sauf un élément particulier fonctionne comme ceci:

<xsl:template match="/"> 
    <xsl:apply-templates select="//person"/> 
</xsl:template> 
<xsl:template match="@*|node()"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="last-name"> 
    <!-- Do nothing, you don't want to copy this. --> 
</xsl:template> 

Je pense que vous comprenez mal comment les expressions sont XPath travail. Votre expression //person [not(last-name)] sélectionne tous les éléments person correspondant à la condition not(last-name), ce qui signifie qu'elle correspond à tous les éléments person qui n'ont pas d'élément last-name. Il se comporte exactement comme il se doit.

+0

Veuillez ne pas recommander les expressions commençant par '//' car elles sont très inefficaces. –

Questions connexes