[XSL-LIST Mailing List Archive Home]
[By Thread]
[By Date]
Re: [xsl] multiple documents, namespaces and the same structure
Subject: Re: [xsl] multiple documents, namespaces and the same structure From: Dan Vint <dvint@xxxxxxxx> Date: Wed, 10 Jan 2001 13:40:35 -0800 (PST) |
Well this gave me the direction I needed, but here is the implementation as callable templates: <xsl:for-each select="//commercial:business/commercial:us.address"> <xsl:call-template name="format.address"> <xsl:with-param name="address.node" select="."/> </xsl:call-template> </xsl:for-each> notice I don't need the local-name() stuff here because this particular stylesheet is only dealing with the information from "commercial" so the template looks like: <xsl:template name="format.address"> <xsl:param name="address.node"/> <xsl:text> </xsl:text> <xsl:choose> <xsl:when test="$address.node/@...='street'"> <!-- Do nothing in this case --> </xsl:when> <xsl:when test="$address.node/@...='ship'"> <tr> <td width="10"> </td> <td colspan="3"> <span class="{$subheading}">Shipping Address</span> </td> </tr> </xsl:when> <xsl:when test="$address.node/@...='mail' and normalize-space(.) != ''"> <tr> <td width="10"> </td> <td colspan="3"> <span class="{$subheading}">Mailing Address</span> </td> </tr> </xsl:when> </xsl:choose> <xsl:call-template name="test.and.print"> <xsl:with-param name="label">Street address:</xsl:with-param> <xsl:with-param name="value" select="$address.node/*[local-name(.)='street'][1]"/> </xsl:call-template> <xsl:call-template name="test.and.print"> <xsl:with-param name="label">Street address 2:</xsl:with-param> <xsl:with-param name="value" select="$address.node/*[local-name(.)='street'][2]"/> </xsl:call-template> <xsl:call-template name="test.and.print"> <xsl:with-param name="label">City:</xsl:with-param> <xsl:with-param name="value" select="$address.node/*[local-name(.)='city']"/> </xsl:call-template> <xsl:call-template name="test.and.print"> <xsl:with-param name="label">State:</xsl:with-param> <xsl:with-param name="value" select="$address.node/*[local-name(.)='state']"/> </xsl:call-template> <xsl:call-template name="test.and.print"> <xsl:with-param name="label">ZIP:</xsl:with-param> <xsl:with-param name="value"> <xsl:value-of select="$address.node/*[local-name(.)='zip']/@main"/> <xsl:if test="$address.node/*[local-name(.)='zip']/@sub != ''">-<xsl:value-of select="$address.node/*[local-name(.)='zip']/@sub"/> </xsl:if> </xsl:with-param> </xsl:call-template> </xsl:template> It is here in this template that I need to capture the element name seperate from the prefixed value so this is where the local-name() is really required because I have address info coming from documents with several different namespaces/prefixes. notice the one little twist for the use of street, this is actually a repeating element in our address model. thanks again. ..dan > > > Equivalent to what you said you had would be > > <xsl:for-each > select="//*[local-name(.)='business']/*[local-name(.)='us.address']"> > > <xsl:value-of select="."/> > <xsl:value-of select="@..."/> > <!-- see below <xsl:value-of select="*[local-name(.)='street']"/>--> > <xsl:value-of select="street"/> > > </xsl:for-each> > > which would work for any namespace as long as the local names were as > given. > > but that would seem to produce a strange output. > > Given > <us.address address.type="street"> > <street>222 Kearney St.</street> > <street>Suite 500</street> > <city>San Francisco</city> > <state>CA</state><zip main="94108" sub="1234"/> > </us.address> > > your template > > > <xsl:template name="format.address"> > <xsl:param name="address.node"/> > <xsl:value-of select="$address.node"/> > <xsl:value-of select="$address.node/@..."/> > <xsl:value-of select="$address.node/street"/> > </xsl:template> > > surely produces > > 222 Kearney St.Suite 500San FranciscoCAstreet222 Kearney St.Suite 500 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > $address.node > ^^^^^^ > $address.node/@... > ^^^^^^^^^^^^^^^^^^^^^^^^^ > $address.node/street > > As you can see, you can use local-name() to make a template apply to any > namespace, but if these address constructs mean the same thing in > different files why are they in different namespaces? It would be more > in the spirit of the game if you placed common elements in a common > namespace. > > Oh actually you don't get the street name twice, as > <xsl:value-of select="$address.node/street"/> > presumably never selects anything as there isn't an element street in > the null namespace. it's always in the namespace attatched to (for > example) commercial: > > so your example produces > > 222 Kearney St.Suite 500San FranciscoCAstreet > > no? > > > David > > _____________________________________________________________________ > This message has been checked for all known viruses by Star Internet delivered > through the MessageLabs Virus Control Centre. For further information visit > http://www.star.net.uk/stats.asp > XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] multiple documents, names, Dan Vint | Thread | [xsl] Passing text() or element nod, Jeni Tennison |
Re: [xsl] Hyphenation in XSL FO, Sebastian Rahtz | Date | [xsl] node() and empty elements, Robert Goheen |
Month |