XPath Queries not working correctly in Schema

R

rosemm

i have a file which I get from a vendor. we are using a industry
schema, hr-xml. however, I can't seem to get any XPath expresions to
work when i receive the file. i think i have pinpointed the problem but
now I need a solution.

I have the following template

<xsl:template match="//PersonName">
<xsl:value-of select="normalize-space(FamilyName)"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="normalize-space(GivenName)"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="normalize-space(MiddleName)"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="normalize-space(Affix)"/>
<xsl:text>,</xsl:text>
</xsl:template>

The beginning of my xml file looks like this (this is where the problem
is)

<Enrollment xmlns="http://ns.hr-xml.org/2004-08-02"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://ns.hr-xml.org/2004-08-02
Enrollment.xsd" creationDate="2005-03-31T11:47:26-06:00">

With this I get no data out of my file.

When I change that to

<Enrollment xmlns="creationDate="2005-03-31T11:47:26-06:00">

the above template works and I retrieve the names of everyone in the
file.

Anyone know exactly what the problem is and how I can fix it?
 
D

David Carlisle

This is the most F of faqs,

<xsl:template match="//PersonName">

which matches the same things as

<xsl:template match="PersonName">

a leading // never does anything useful in a match pattern, it only
changes the default priority.

matches PersonName in no-namespace.

similarly

<xsl:value-of select="normalize-space(FamilyName)"/>

selects FamilyName in no-namespace

<Enrollment xmlns="http://ns.hr-xml.org/2004-08-02"

sets the default namespace to http://ns.hr-xml.org/2004-08-02
and I would guess that your PersonName and
FamilyName elements are in that namespace, so these are not matched by
the Xpath expressions above.

add

xmlns:h="http://ns.hr-xml.org/2004-08-02"

to your xsl:stylesheet and then use

<xsl:template match="h:personName">
<xsl:value-of select="normalize-space(h:FamilyName)"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="normalize-space(h:GivenName)"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="normalize-space(h:MiddleName)"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="normalize-space(h:Affix)"/>
<xsl:text>,</xsl:text>
</xsl:template>


David
 
M

Martin Honnen

rosemm said:
i have a file which I get from a vendor. we are using a industry
schema, hr-xml. however, I can't seem to get any XPath expresions to
work when i receive the file. i think i have pinpointed the problem but
now I need a solution.

I have the following template

<xsl:template match="//PersonName">
<xsl:value-of select="normalize-space(FamilyName)"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="normalize-space(GivenName)"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="normalize-space(MiddleName)"/>
<xsl:text>,</xsl:text>
<xsl:value-of select="normalize-space(Affix)"/>
<xsl:text>,</xsl:text>
</xsl:template>

The beginning of my xml file looks like this (this is where the problem
is)

<Enrollment xmlns="http://ns.hr-xml.org/2004-08-02"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://ns.hr-xml.org/2004-08-02
Enrollment.xsd" creationDate="2005-03-31T11:47:26-06:00">

With this I get no data out of my file.

The elements are probably in the default namespace so to select them
with an XPath 1.0 expression you need to bind a prefix to that namespace
in the stylesheet e.g.
<xsl:stylesheet
xmlns:hr="http://ns.hr-xml.org/2004-08-02"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
then use that prefix in your XPath expression e.g.
//hr:person
or
<xsl:value-of select="normalize-space(hr:FamilyName)"/>

See also
<http://www.faqts.com/knowledge_base/view.phtml/aid/34022/fid/1753>
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top