|
Subject: Re: [xsl] Using name() with XPath expressions (fwd) From: Jeni Tennison <mail@xxxxxxxxxxxxxxxx> Date: Sat, 14 Jul 2001 08:58:42 +0100 |
Hi Jenny,
> The problem is that if the variable $field contains the path of a
> text node instead of the name itself, the name function doesn't
> work. For example, if $field contains 'author/lastname', the name
> function assumes that 'author/lastname' is the string value of the
> name of a node instead of the path to a node. How do I alter this
> comparison so that it works with $field values that are paths as
> well as field values that are names? Thanks in advance.
If there are only two levels of children under bibitem, then you could
use a more general solution that used the substring before the '/' to
find the name of the child, and the substring after the '/' to find
the name of the grandchild:
<xsl:for-each select="bibliography/bibitem">
<xsl:if test="(contains($field, '/') and
$search = *[name() = substring-before($field, '/')]
/*[name() = substring-after($field, '/')]) or
$search = *[name() = $field]">
<xsl:call-template name="printBib" />
</xsl:if>
</xsl:for-each>
You can continue doing this kind of thing to an arbitrary depth, but
if you get past grandchildren you may find it simpler to create a
template that retrieves the value of the relevant descendant when
passed a path as a parameter. This template works by stepping
recursively down the path:
<xsl:template match="*" mode="string-value">
<xsl:param name="path" />
<xsl:choose>
<xsl:when test="contains($path, '/')">
<xsl:apply-templates mode="string-value"
select="*[name() = substring-before($path, '/')]">
<xsl:with-param name="path"
select="substring-after($path, '/')" />
</xsl:apply-templates>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="*[name() = $path]" />
</xsl:otherwise>
</xsl:choose>
</xsl:template>
You can call this template to find the value of the node indicated by
the path, which you then test against the search string:
<xsl:for-each select="bibliography/bibitem">
<xsl:variable name="value">
<xsl:apply-templates select="." mode="string-value">
<xsl:with-param name="path" select="$field" />
</xsl:apply-templates>
</xsl:variable>
<xsl:if test="$search = $value">
<xsl:call-template name="printBib" />
</xsl:if>
</xsl:for-each>
If you reach a point where the $field parameter contains arbitrary
XPaths, including predicates and axes other than the child axis, then
you need to start thinking about using extension functions like
saxon:evaluate() to evaluate the location path, or creating XSLT using
XSLT.
Cheers,
Jeni
---
Jeni Tennison
http://www.jenitennison.com/
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] Nestled <xsl:choose>, David Carlisle | Thread | RE: [xsl] Using name() with XPath e, Michael Kay |
| [xsl] Re: XSL-List Digest V3 #915, Alexey Skoblikov | Date | Re: [xsl] Nestled <xsl:choose>, Jeni Tennison |
| Month |