xmlxpathxsltalto

XSLT document(): can't use xpath in the document


I use document() to fetch metadata from an xml file to complete an ALTO file, here are my alto file (without the layout):

<?xml version="1.0" encoding="UTF-8"?>
<alto xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns="http://www.loc.gov/standards/alto/ns-v4#"
      xsi:schemaLocation="http://www.loc.gov/standards/alto/ns-v4# http://www.loc.gov/standards/alto/v4/alto-4-2.xsd">
  <Description>
    <MeasurementUnit>pixel</MeasurementUnit>
    <sourceImageInformation>
      <fileName>B_168_15-10-3_0001.jpg</fileName>
    </sourceImageInformation>
  </Description>
</alto>

and the xml file who contains the metadata:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <row>
        <Heading0>img</Heading0>
        <Heading1>Cote</Heading1>
        <Heading2>Institution</Heading2>
        <Heading3>Collection</Heading3>
        <Heading4>Document</Heading4>
    </row>
    <row>
        <Heading0>A_bcd_ef-g-h_0001.jpg</Heading0>
        <Heading1>A_bcd_ef-g-h_0001 </Heading1>
        <Heading2>A bcd/ef-g.h</Heading2>
        <Heading3>coll1</Heading3>
    </row>
    <row>
        <Heading0>A_bcd_ef-g-h_0002.jpg</Heading0>
        <Heading1>A_bcd_ef-g-h_0002 </Heading1>
        <Heading2>A bcd/ef-g.h</Heading2>
        <Heading3>coll1</Heading3>
    </row>

I need to add a <documentIdentifier> in my alto file who should have the same value as the <Heading2>, so I try to use the document() function, but it only return <documentIdentifier xmlns=""/>. It seems that I can't select elements in the path of the file.

<xsl:stylesheet  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:alto="http://www.loc.gov/standards/alto/ns-v4#"
    xpath-default-namespace="http://www.loc.gov/standards/alto/ns-v4#" version="2.0"
    exclude-result-prefixes="xs alto">
    <xsl:output encoding="UTF-8" method="xml" indent="yes" 
        omit-xml-declaration="yes"/>
   
    <xsl:template match="@*|node()">
        
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    
    <xsl:template match="sourceImageInformation">
            <xsl:apply-templates/>
            
            <!-- Creating a variable with a information similar in booth documents *.jpeg -->
            <xsl:variable name="filename">
                <xsl:value-of select="//fileName"/>
            </xsl:variable>
    
            <!-- Creating a variable for the information to copy -->
            <xsl:variable name="cote">
                <xsl:copy-of select= "document('recolement.xml')/root/row[Heading0=$filename]/Heading2"/>    
            </xsl:variable>

            <documentIdentifier>
                <xsl:value-of select="$cote"/>
            </documentIdentifier>
                 
    </xsl:template>    
    
</xsl:stylesheet>

The path is good, because if I call

<documentIdentifier>
    <xsl:value-of select="$cote"/>
</documentIdentifier>

It return the content of my file...

What am I doing wrong? Thank's for the help!


Solution

  • Make <xsl:copy-of select= "document('recolement.xml')/root/row[Heading0=$filename]/Heading2"/> into <xsl:copy-of select= "document('recolement.xml')/root/row[Heading0=$filename]/Heading2" xpath-default-namespace=""/>. In the end it would be more efficient to use a key for the cross-reference: <xsl:key name="row-by-hdng0" match="row" use="Heading0" xpath-default-namespace=""/>, then use e.g. <xsl:copy-of select="key('row-by-hdng0', $filename, document('recolement.xml'))/Heading2" xpath-default-namespace=""/>.