|
[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] RE: Can't get predicates working.
Marco,
On this input (your input corrected for markup):
This XSL: <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="text"/> <xsl:key match="employee" name="employee-by-refEID" use="@EID"/> <xsl:template match="/">
<xsl:apply-templates select="company/division"/>
</xsl:template><xsl:template match="division"> <xsl:text>Division Name = </xsl:text><xsl:value-of select="@DID"/><xsl:text>
</xsl:text> <xsl:apply-templates select="projects/project"/> </xsl:template> <xsl:template match="project">
<xsl:text>PID = </xsl:text><xsl:value-of select="@PID"/>
<xsl:text>, PNAME = </xsl:text><xsl:value-of select="PNAME"/>
<xsl:text>, BUDGET = </xsl:text><xsl:value-of select="BUDGET"/>
<xsl:text>
</xsl:text> <!-- list employees using key() -->
<xsl:apply-templates select="assigns/assign" mode="use-key"/>
<xsl:text>
</xsl:text> <!-- list employees using relative path -->
<xsl:apply-templates select="assigns/assign" mode="relative-path"/><xsl:text>
</xsl:text> </xsl:template> <xsl:template match="assign" mode="use-key"> <xsl:text>EID = </xsl:text><xsl:value-of select="@refEID"/> <xsl:text>, ENAME = </xsl:text><xsl:value-of select="key('employee-by-refEID', @refEID)/ENAME"/> <xsl:text>, OFFICE = </xsl:text><xsl:value-of select="key('employee-by-refEID', @refEID)/OFFICE"/> <xsl:text>, HOURS = </xsl:text><xsl:value-of select="HOURS"/> <xsl:text>
</xsl:text> </xsl:template> <xsl:template match="assign" mode="relative-path"> <xsl:variable name="refeid" select="@refEID"/> <xsl:variable name="emp" select="/company/division/employees/employee[@EID = current()/@refEID]"/> <xsl:text>EID = </xsl:text><xsl:value-of select="@refEID"/> <xsl:text>, ENAME = </xsl:text><xsl:value-of select="/company/division/employees/employee[@EID = current()/@refEID]/ENAME"/> <xsl:text>, OFFICE = </xsl:text><xsl:value-of select="../../../../employees/employee[@EID = @refeid]/OFFICE"/> <xsl:text>, BIRTHDATE = </xsl:text><xsl:value-of select="$emp/BIRTHDATE"/> <xsl:text>, HOURS = </xsl:text><xsl:value-of select="HOURS"/> <xsl:text>
</xsl:text> </xsl:template> </xsl:stylesheet> Produces this output: Division Name = XXX PID = XYZ, PNAME = Some Name, BUDGET = 111 EID = XXX000, ENAME = Joe Blow, OFFICE = 1204, HOURS = 12 EID = XXX001, ENAME = Joe Smith, OFFICE = 1203, HOURS = 78 EID = XXX000, ENAME = Joe Blow, OFFICE = , BIRTHDATE = 1924-08-01, HOURS = 12 EID = XXX001, ENAME = Joe Smith, OFFICE = , BIRTHDATE = 1930-08-01, HOURS = 78 PID = XY1, PNAME = Some OtherName, BUDGET = 112 EID = XXX000, ENAME = Joe Blow, OFFICE = 1204, HOURS = 34 EID = XXX002, ENAME = Joe Jerry, OFFICE = 0003, HOURS = 1234 EID = XXX000, ENAME = Joe Blow, OFFICE = , BIRTHDATE = 1924-08-01, HOURS = 34 EID = XXX002, ENAME = Joe Jerry, OFFICE = , BIRTHDATE = 1930-08-01, HOURS = 1234 The employee-list is repeated per project for pedagogical purposes only. If you want text output with aligned columns, search the net for templates that pad and justify text. Alternatively you could generate HTML output and use tables. I assume your real issue was how, once you were at a node, to get related information from another node. Thus the stylesheet above shows how to do it using keys, using an absolute path and matching on a common attribute, and using a relative path and matching on a common attribute. Along the way it also shows the use of modes, the current() function, and avoiding the current() function by using a previously-initialized variable. keys() are useful when you need to locate something repeatedly and fast; I believe internally this is represented as a hash structure, so what you gain in speed you may lose in memory. The usual space/time tradeoff. When you need to access something repeatedly, but only in one place, it's useful to create a local variable, as we do with $emp. That gives you to the advantage of doing the full lookup just once and subsequent lookups locally, without the reference staying around until transform-end (as would be the case with keys). BTW, I suppose more and more of your "company" XML is slowly being dribbled in as you encounter new issues in its transformation. Your taking the time to cull out only the portions of interest is appreciated. If you would, however, it would be huge if the subjectline reflected the issue at hand--for instance, how to traverse to or display information from "related" nodes. Often, in formulating the issue you may have some insight into its solutions! :-) Regards, --A _________________________________________________________________ Dont just search. Find. Check out the new MSN Search! http://search.msn.click-url.com/go/onm00200636ave/direct/01/
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|

Cart








