|
[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: How to do macro substitution in XPath?
On 02/12/2023 16:36, Roger L Costello costello@xxxxxxxxx wrote:
> Hi Folks,
>
> I am converting prose like this:
>
> If the title = "Path to Power" and the author = "Robert A. Caro" (Lyndon
Baines Johnson (LBJ)), then
> process LBJ as follows
> action 1
> If the title = "Power Broker" and the author = "Robert A. Caro" (Robert
Moses (RM)), then
> process RM as follows
> action 2
> Neither LBJ nor RM
> action 3
>
> I need the XPath to be as like the prose as possible.
>
> Suppose the XPath will operate on XML documents like this:
>
> <Book>
> <Title>Path to Power</Title>
> <Author>Robert A. Caro</Author>
> </Book>
>
> Below is one approach to writing the XPath. See the XPath in the
xsl:value-of element. Notice the use of XML ENTITIES.
>
> The advantage of that approach is the XPath looks like the prose.
>
> The disadvantage with that approach is that ENTITIES are not XPath. I need
to stick with pure XPath. What XPath do you recommend?
>
Another option would be
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0"
B B B xmlns:xs="http://www.w3.org/2001/XMLSchema"
B B B exclude-result-prefixes="#all">
B B B <xsl:param name="LBJ" as="function(node()) as xs:boolean"
select="function($node) { $node ! ((/Book/Title eq 'Path to Power') and
(/Book/Author eq 'Robert A. Caro')) }"/>
B B B <xsl:param name="RM" as="function(node()) as xs:boolean"
select="function($node) { $node ! ((/Book/Title eq 'Power Broker') and
(/Book/Author eq 'Robert A. Caro')) }"/>
B B B <xsl:template match="/">
B B B B B B B <xsl:value-of select="
B B B B B B B B B B B if ($LBJ(.)) then
B B B B B B B B B B B B B B B 'action 1'
B B B B B B B B B B B else if ($RM(.)) then
B B B B B B B B B B B B B B B 'action 2'
B B B B B B B B B B B else if (not(($LBJ(.)) or ($RM(.)))) then
B B B B B B B B B B B B B B B 'action 3'
B B B B B B B B B B B else
B B B B B B B B B B B B B B B 'Error'
B B B B B B B B B B B "/>
B B B </xsl:template>
but then I would of course rather use one function taking the "title"
and the "author" as additional parameters and call them as needed:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0" xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="#all"> <xsl:param name="testTitleAuthor"
as="function(node(), xs:string, xs:string) as xs:boolean"
select="function($node, $author, $title) { $node ! ((/Book/Title eq
'Path to Power') and (/Book/Author eq 'Robert A. Caro')) }"/> <xsl:param
name="LBJ" as="function(node()) as xs:boolean"
select="$testTitleAuthor(?, 'Path to Power', 'Robert A. Caro')"/>
<xsl:param name="RM" as="function(node()) as xs:boolean"
select="$testTitleAuthor(?, 'Power Broker', 'Robert A. Caro')"/>
<xsl:template match="/"> <xsl:value-of select=" if ($LBJ(.)) then
'action 1' else if ($RM(.)) then 'action 2' else if (not(($LBJ(.)) or
($RM(.)))) then 'action 3' else 'Error' "/> </xsl:template>
</xsl:stylesheet>
|
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








