2012-06-19 4 views
1

Je voulais juste vérifier si un moyen d'éviter le codage verbeux comme ci-dessous dans xslt1.0, où nous avons plusieurs conditions de vérification, les éléments de sortie à copier en fonction de certaines conditions. Si la condition n'est pas vraie, alors l'élément lui-même sera absent dans la sortie. La raison pour laquelle je demande, nous avons beaucoup d'éléments présents dans le fichier xsl.xslt manière efficace de vérifier les conditions

Mon xslt

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    > 
    <xsl:output omit-xml-declaration="yes" indent="yes" /> 
    <xsl:strip-space elements="*" /> 
    <xsl:template match="/"> 
    <Root> 
    <xsl:if test="Root/a/text() = '1'"> 
     <first>present</first> 
    </xsl:if> 
    <xsl:if test="Root/b/text() = '1'"> 
     <second>present</second> 
    </xsl:if> 
    <xsl:if test="Root/c/text() = '1'"> 
     <third>present</third> 
    </xsl:if> 
    <xsl:if test="Root/d/text() = '1'"> 
     <fourth>present</fourth> 
    </xsl:if> 
    </Root> 
    </xsl:template> 
</xsl:stylesheet> 

mon entrée xml

<Root> 
    <a>1</a> 
    <b>1</b> 
    <c>0</c> 
    <d>1</d> 
</Root> 

ma sortie

<Root> 
    <first>present</first> 
    <second>present</second> 
    <fourth>present</fourth> 
</Root> 

Répondre

2
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:my="my:my"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<my:ord> 
    <first>first</first> 
    <second>second</second> 
    <third>third</third> 
    <fourth>fourth</fourth> 
</my:ord> 

<xsl:variable name="vOrds" select="document('')/*/my:ord/*"/> 

<xsl:template match="Root/*[. = 1]"> 
    <xsl:variable name="vPos" select="position()"/> 

    <xsl:element name="{$vOrds[position()=$vPos]}">present</xsl:element> 
</xsl:template> 
<xsl:template match="text()"/> 
</xsl:stylesheet> 

Lorsque cette transformation est appliquée sur le document XML fourni:

<Root> 
    <a>1</a> 
    <b>1</b> 
    <c>0</c> 
    <d>1</d> 
</Root> 

le résultat recherché, est produit correct:

<Root> 
    <first>present</first> 
    <second>present</second> 
    <fourth>present</fourth> 
</Root> 
1

Une façon de le faire serait de créer un modèle pour la sortie en sortie template.xml:

<Root> 
    <first>present</first> 
    <second>present</second> 
    <third>present</third> 
    <fourth>present</fourth> 
</Root> 

puis de traiter ceci:

<xsl:variable name="input" select="/"/> 

<xsl:template match="Root/*"> 
    <xsl:variable name="p" select="position()"/> 
    <xsl:if test="$input/Root/*[$p] = '1'"> 
    <xsl:copy-of select="."/> 
    </xsl:if> 
</xsl:template> 

<xsl:template match="/"> 
    <Root> 
    <xsl:apply-templates select="document('output-template.xml')/Root/*"/> 
    </Root> 
</xsl:template> 
Questions connexes