J'essaie de garder mon xsl DRY et par conséquent je voulais appeler le même modèle pour 2 sections d'un document XML qui se trouve être le même type complexe (ContactDetails et AltContactDetails). Étant donné le code XML suivant:Appeler le même xsl: modèle pour différents noms de nœuds du même type complexe
<?xml version="1.0" encoding="UTF-8"?>
<RootNode>
<Name>Bob</Name>
<ContactDetails>
<Address>
<Line1>1 High Street</Line1>
<Town>TownName</Town>
<Postcode>AB1 1CD</Postcode>
</Address>
<Email>[email protected]</Email>
</ContactDetails>
<AltContactDetails>
<Address>
<Line1>3 Market Square</Line1>
<Town>TownName</Town>
<Postcode>EF2 2GH</Postcode>
</Address>
<Email>[email protected]</Email>
</AltContactDetails>
</RootNode>
J'ai écrit une feuille de style XSL comme suit:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<PersonsName>
<xsl:value-of select="RootNode/Name"/>
</PersonsName>
<xsl:call-template name="ContactDetails">
<xsl:with-param name="data"><xsl:value-of select="RootNode/ContactDetails"/></xsl:with-param>
<xsl:with-param name="elementName"><xsl:value-of select="'FirstAddress'"/></xsl:with-param>
</xsl:call-template>
<xsl:call-template name="ContactDetails">
<xsl:with-param name="data"><xsl:value-of select="RootNode/AltContactDetails"/></xsl:with-param>
<xsl:with-param name="elementName"><xsl:value-of select="'SecondAddress'"/></xsl:with-param>
</xsl:call-template>
</xsl:template>
<xsl:template name="ContactDetails">
<xsl:param name="data"></xsl:param>
<xsl:param name="elementName"></xsl:param>
<xsl:element name="{$elementName}">
<FirstLine>
<xsl:value-of select="$data/Address/Line1"/>
</FirstLine>
<Town>
<xsl:value-of select="$data/Address/Town"/>
</Town>
<PostalCode>
<xsl:value-of select="$data/Address/Postcode"/>
</PostalCode>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Quand je tente d'exécuter la feuille de style, il est de me plaindre que je dois:
Pour utiliser un fragment d'arborescence de résultats dans une expression de chemin, utilisez exsl: node-set() ou spécifiez la version 1.1
Je ne veux pas aller à la version 1.1 .. Donc, quelqu'un sait comment faire fonctionner l'exsl: node-set() pour l'exemple ci-dessus?
Ou si quelqu'un connaît une meilleure façon d'appliquer le même modèle à 2 sections différentes, cela m'aiderait vraiment?
Merci
Dave
Merci pour cela .. Je ne savais pas sur le tuyau dans le modèle de correspondance .. Cela m'a vraiment aidé. – CraftyFella
@CraftyFella: Ces soi-disant «expressions de correspondance» sont un sous-ensemble de XPath, beaucoup de choses qui fonctionnent dans XPath fonctionneront ici aussi. – Tomalak
Bonne réponse! +1 –