[xsl] How to do macro substitution in XPath?

Subject: [xsl] How to do macro substitution in XPath?
From: "Roger L Costello costello@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Sat, 2 Dec 2023 15:35:56 -0000
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?

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xsl:stylesheet[
    <!ENTITY LBJ "((/Book/Title eq 'Path to Power') and (/Book/Author eq
'Robert A. Caro'))">
    <!ENTITY RM "((/Book/Title eq 'Power Broker') and (/Book/Author eq 'Robert
A. Caro'))">
]>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
version="3.0">
    <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>

Current Thread