How to convert Xpath syntax to XSL/XSLT syntax?

Question

I understand how XPath syntax works, and can write Xpath commands to extract certain information from a XML file.
I would like to convert my XPath commands to XSLT scripts so that someone else can just run the script over the XML file to get the same output.

e.g.

I have a XML file that, let's say, looks like follows:

<?xml version="1.0" encoding="UTF-8"?>
  <library>
        <section id="109196796">
            <master_information>
                <shelf_identifier>
                    <identifier type="CodeX" type_id="2">LB1500605917</identifier>
                    <identifier type="Common Code" type_id="15">150060591</identifier>
                </shelf_identifier>
                <shelf_master>
                    <section_type>1</section_type>
                    <book_type>3</book_type>
                </shelf_master>
            </master_information>
        </section>
        <section id="109196798">
            <master_information>
                <shelf_identifier>
                    <identifier type="CodeX" type_id="2">LB0777775917</identifier>
                    <identifier type="Common Code" type_id="15">077777591</identifier>
                </shelf_identifier>
                <shelf_master>
                    <section_type>1</section_type>
                    <book_type>3</book_type>
                </shelf_master>
            </master_information>
        </section>
        <section id="109196800">
            <master_information>
                <shelf_identifier>
                    <identifier type="CodeX" type_id="2">LB2589165917</identifier>
                    <identifier type="Common Code" type_id="15">258916591</identifier>
                </shelf_identifier>
                <shelf_master>
                    <section_type>1</section_type>
                    <book_type>3</book_type>
                </shelf_master>
            </master_information>
        </section>
  </library>


If I run the XPath command below,

//identifier[@type='CodeX']

I get the output:

LB1500605917
LB0777775917
LB2589165917

..which is expected. Now, I tried converting the XPath command to an XSL syntax as below:

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>
    <xsl:variable name="return">
    <xsl:text>
</xsl:text> <!-- defined a line break -->
    </xsl:variable>
    <xsl:template match="//library"></xsl:template>
    <xsl:template match="//section/master_information/shelf_identifier/identifier"> 
        <xsl:value-of select="@type='CodeX'"/>
        <xsl:value-of select="$return"/> <!-- this basically puts a line break -->
    </xsl:template>
</xsl:stylesheet>

The XSL seems to be correct. However, no output is generated.

I am new to XSL/XSLT. What am I doing wrong?


Show source
| xml   | xslt   | xpath   2016-11-18 16:11 2 Answers

Answers to How to convert Xpath syntax to XSL/XSLT syntax? ( 2 )

  1. 2016-11-18 16:11

    What you could do is add a template matching the same nodes as your xpath, then outputting the value along with a newline...

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output method="text"/>
      <!--The strip-space isn't completely necessary. I just always include it in my
      default stylesheets. It strips whitespace. You can preserve whitespace with
      xsl:preserve-space. See https://www.w3.org/TR/xslt#strip for more details.-->
      <xsl:strip-space elements="*"/>
    
      <!--Suppress output of text nodes by built-in templates.-->
      <xsl:template match="text()"/>
    
      <!--Match "indentifier" elements that contain a "type" attribute
      with the value of "CodeX".-->
      <xsl:template match="identifier[@type='CodeX']">
        <!--Output the value of the current context ("identifier") concatenated with
        a newline. ("&#xA;" is a hex entity reference. You could also use a decimal
        reference ("&#10;")). You could use either of these references as the value
        of a variable too (or even declare it as an entity).
        I use normalize-space() instead of . to clean up any additional spaces.
        See https://www.w3.org/TR/xpath/#function-normalize-space for details.-->
        <xsl:value-of select="concat(normalize-space(),'&#xA;')"/>
      </xsl:template>
    
    </xsl:stylesheet>
    

    Notice the empty template that matches text(). This is added to suppress the output of text() nodes by XSLT's built-in template rules.

    Also note that I didn't use // in my match. This is also because of the built-in rules; they allow recursive processing by default.

  2. 2016-11-18 17:11

    Why don't you do simply:

    XSLT 1.0

    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" encoding="UTF-8"/>
    
    <xsl:template match="/">
        <xsl:for-each select="//identifier[@type='CodeX']">
            <xsl:value-of select="."/>
            <xsl:text>&#10;</xsl:text>
        </xsl:for-each>
    </xsl:template>
    
    </xsl:stylesheet>
    

Leave a reply to - How to convert Xpath syntax to XSL/XSLT syntax?

◀ Go back