Connecting Tech Pros Worldwide Help | Site Map

[XSLT] How to establish a context node without <xsl:for-each>

  #1  
Old November 17th, 2008, 09:35 AM
Hoi Wong
Guest
 
Posts: n/a
I have an XSLT script collection that converts messed up XML to usuable XML.
Instead of generic template matching, I want to establish a context node for
some branches so that I don't have to rely on absolute path. Here's a
simplified version of my work:


[root.xsl]:
<xsl:include href="common.xsl"/>

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

==================================

[patientData.xsl]:

<xsl:template name="patientData">
<birthyear>
<xsl:value-of
select="document('rpt_pat.xml')//parameter[@name='PatientBirthYear']"/>
</birthyear>
<gender>
<xsl:value-of
select="document('rpt_pat.xml')//parameter[@name='PatientGender]"/>
</gender>
</xsl:template>


Instead of specifying document('rpt_pat.xml') every time using absolute
paths, I could have used <xsl:for-each select=document('rpt_pat.xml')>.
However, I'd like to avoid using this syntax because there's only one
instance of document('rpt_pat.xml') node. Using <xsl:for-eachcan lead to
whoever that reads my XSLT scripts into thinking that there are multiple
instances of the document('rpt_pat.xml') node, adding confusion to the
already huge chaos.

I'd like to avoid <xsl:template match="(something)"because some tags have
the same names in the messy XML files that I'm trying to parse, and they can
be distinguished only by observing the hieracy (which branch that XML tag is
under).

Can anybody suggest a neat way to do that? Thanks in advance.

-- Hoi


  #2  
Old November 17th, 2008, 11:05 AM
Martin Honnen
Guest
 
Posts: n/a

re: [XSLT] How to establish a context node without <xsl:for-each>


Hoi Wong wrote:
Quote:
<xsl:template name="patientData">
<birthyear>
<xsl:value-of
select="document('rpt_pat.xml')//parameter[@name='PatientBirthYear']"/>
</birthyear>
<gender>
<xsl:value-of
select="document('rpt_pat.xml')//parameter[@name='PatientGender]"/>
</gender>
</xsl:template>
>
>
Instead of specifying document('rpt_pat.xml') every time using absolute
paths, I could have used <xsl:for-each select=document('rpt_pat.xml')>.
However, I'd like to avoid using this syntax because there's only one
instance of document('rpt_pat.xml') node. Using <xsl:for-eachcan lead to
whoever that reads my XSLT scripts into thinking that there are multiple
instances of the document('rpt_pat.xml') node, adding confusion to the
already huge chaos.
I don't think there is a way to change the current node without using
apply-templates or for-each. If you want to shorten the code then using
a variable could do e.g.


<xsl:template name="patientData">
<xsl:variable name="pat_doc" select="document('rpt_pat.xml')"/>
<birthyear>
<xsl:value-of
select="$pat_doc//parameter[@name='PatientBirthYear']"/>
</birthyear>
<gender>
<xsl:value-of
select="$pat_doc//parameter[@name='PatientGender]"/>
</gender>
</xsl:template>
--

Martin Honnen
http://JavaScript.FAQTs.com/
  #3  
Old November 17th, 2008, 11:15 AM
Richard Tobin
Guest
 
Posts: n/a

re: [XSLT] How to establish a context node without <xsl:for-each>


In article <gfrdkf$itq$1@news.stanford.edu>,
Hoi Wong <wonghoi@stanford.eduwrote:
Quote:
>Instead of specifying document('rpt_pat.xml') every time using absolute
>paths, I could have used <xsl:for-each select=document('rpt_pat.xml')>.
>However, I'd like to avoid using this syntax because there's only one
>instance of document('rpt_pat.xml') node. Using <xsl:for-eachcan lead to
>whoever that reads my XSLT scripts into thinking that there are multiple
>instances of the document('rpt_pat.xml') node, adding confusion to the
>already huge chaos.
Apply-templates and for-each are the only constructs that let you change
the context node.

I recommend using for-each with a comment to indicate that its only
purpose is to set the context.

-- Richard


--
Please remember to mention me / in tapes you leave behind.
  #4  
Old November 18th, 2008, 01:05 AM
David Carlisle
Guest
 
Posts: n/a

re: [XSLT] How to establish a context node without <xsl:for-each>


Hoi Wong wrote:
Quote:
Instead of specifying document('rpt_pat.xml') every time using absolute
paths,
as others have said you can't change the current node without for-each
or apply-templates, etc, however you could use a variable
<xsl:variable name="rpt" select="document('rpt_pat.xml')"/>
then you can use $rpt///parameter[@name='PatientBirthYear']

In xslt2 I'd do
<xsl:variable name="rpt" select="document('rpt_pat.xml')"/>
<xsl:key name="rpt" match="parameter" use="@name"/>
then


<xsl:template name="patientData">
<birthyear>
<xsl:value-of select="key('rpt','PatientBirthYear',$rpt)"/>
</birthyear>
<gender>
<xsl:value-of select="key('rpt','PatientGender',$rpt)"/>
</gender>
</xsl:template>

The third argument of key doesn't exactly change the current node but it
changes the effective node used for determing the key lookup, which has
more or less the same effect here.

David

--
http://dpcarlisle.blogspot.com
  #5  
Old November 21st, 2008, 01:25 AM
Hoi Wong
Guest
 
Posts: n/a

re: [XSLT] How to establish a context node without <xsl:for-each>


"David Carlisle" <david-news@dcarlisle.demon.co.ukwrote in message
news:MnoUk.83905$s62.13489@newsfe01.ams2...
Quote:
Hoi Wong wrote:
>
Quote:
>Instead of specifying document('rpt_pat.xml') every time using absolute
>paths,
>
as others have said you can't change the current node without for-each or
apply-templates, etc, however you could use a variable
<xsl:variable name="rpt" select="document('rpt_pat.xml')"/>
then you can use $rpt///parameter[@name='PatientBirthYear']
>
In xslt2 I'd do
<xsl:variable name="rpt" select="document('rpt_pat.xml')"/>
<xsl:key name="rpt" match="parameter" use="@name"/>
then
>
>
<xsl:template name="patientData">
<birthyear>
<xsl:value-of select="key('rpt','PatientBirthYear',$rpt)"/>
</birthyear>
<gender>
<xsl:value-of select="key('rpt','PatientGender',$rpt)"/>
</gender>
</xsl:template>
>
The third argument of key doesn't exactly change the current node but it
changes the effective node used for determing the key lookup, which has
more or less the same effect here.
>
David
>
--
http://dpcarlisle.blogspot.com
Thanks for the hint.

Unfortunately, the software that I'm using (namely MATLAB and the orphaned
proprietary data converter from the vendor) only support XSLT 1.0.

In fact, I was using the variables trick before hitting this forum so I'll
stick to that because it's easier to debug than switching nodes.

Cheers,
Hoi


Closed Thread