This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Accessing multiple documents
- To: XSL-List <xsl-list at mulberrytech dot com>
- Subject: Accessing multiple documents
- From: Peter Paulus <paulus at neroc dot nl>
- Date: Mon, 31 Jul 2000 11:38:04 +0200
- Reply-To: xsl-list at mulberrytech dot com
Hello XSL-developer,
On trying to access multiple documents from XSLT I ran into a problem, I
can't seem to resolve. (My knowledge of XSLT is very deep, so that may be
the problem in itself).
From one XML-document (Collate.xml) I want to access a second to retrieve
the name of an element (Bind.xml) and a third document to retrieve the
content of this element (EZ722.xml).
For the sake of clarity I've stripped most parts of the XML-documents that
do not matter.
Here's my primary document: Collate.xml
<?xml version='1.0'?>
<collate content='EZ722.xml' binder='Bind.xml'/>
The second document is: Bind.xml
<?xml version='1.0' encoding='ISO-8859-1'?>
<bind:binding xmlns:bind='urn:NPS-layoutBinder'
xmlns='urn:NPS-layoutBinder'>
<bind><content element='reis/code'/></bind>
<bind><content element='reis/titel[@nivo=1]'/></bind>
</bind:binding>
The third document is: EZ722.xml
<?xml version='1.0' encoding='US-ASCII'?>
<!-- Neroc Publishing Solutions, 20000725 -->
<!DOCTYPE reis SYSTEM "reis.dtd">
<reis type='rondreis'>
<code>EZ722</code>
<titel nivo='1'>14 dagen The Deep South</titel>
<titel nivo='2'>Rondreis door het historische zuiden van Amerika</titel>
</reis>
This is the XSLT transformation stylesheet: Collate.xsl
<?xml version='1.0'?>
<xsl:transform version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
xmlns:Binder='urn:NPS-layoutBinder'>
<xsl:output method='xml' omit-xml-declaration='yes' media-type='text/xml'/>
<xsl:template match='/'>
<xsl:apply-templates/>
</xsl:template>
<xsl:template match='collate'>
*** Hardcoded goal ***
<xsl:value-of select='document("EZ722.xml")/reis/code'/>
*** Scenario 1: ***
<xsl:value-of select='document(@content)/reis/code'/>
*** Scenario 2:
<xsl:variable name='element'
select='document(@binder)/Binder:binding/Binder:bind[1]/Binder:content/@elem
ent'/>
Content element to retrieve: <xsl:value-of select='$element'/>
Content of this element: <xsl:value-of
select='document("EZ722.xml")/$element'/>
<!--
Xalan:
_exceptionOccurred: org.apache.xalan.xslt.XSLProcessorException (pattern =
'document("EZ722.xml")/$element'
Extra illegal tokens: 'element')
XT:
xt: file:/E:/NT_SER~1/XML.Collate.xsl:20 expected node test
-->
*** Scenario 3: ***
<xsl:variable name='element'
select='document(@binder)/Binder:binding/Binder:bind[1]/Binder:content/@elem
ent'/>
Content element to retrieve: <xsl:value-of select='$element'/>
Content of this element: <xsl:value-of
select='document(@content)/$element'/>
<!--
Xalan:
_exceptionOccurred: org.apache.xalan.xslt.XSLProcessorException (pattern =
'document(@content)/$element'
Extra illegal tokens: 'element')
XT:
xt: file:/E:/NT_SER~1/XML.Collate.xsl:34 expected node test
-->
*** Scenario 4: ***
<xsl:variable name='content'>document("<xsl:value-of
select='@content'/>")/<xsl:value-of
select='document(@binder)/Binder:binding/Binder:bind[1]/Binder:content/@elem
ent'/></xsl:variable>
<xsl:copy-of select='$content'/>
*** Scenario 5: ***
<xsl:variable name='content'><xsl:value-of
select='@content'/>/<xsl:value-of
select='document(@binder)/Binder:binding/Binder:bind[1]/Binder:content/@elem
ent'/></xsl:variable>
<xsl:copy-of select='document($content)'/>
</xsl:template>
</xsl:transform>
My hardcoded goal is displaying element reis/code from EX722.xml. This work,
but is not flexible enough for my application.
I've tried several scenario's to resolve this problem.
Scenario 1 show that I can have a variable 'content'-document. This is one
level of indirection and work. But it still is not flexible enough.
Scenario 2 show that I try to retrieve a variable element form a fixed
document. This does not work. (And wouldn't be flexible enough)
Scenario 3 show that I try to retrieve a variable element from a variable
document. This does not work, but would give me the flexibility I'm looking
for.
Scenario 4 show that I first build up the name of the element from it's
parts and then try to access it. This does not work. It merely displays the
name I've build up.
Scenario 5 try to build up a name from the variable parts and pass that to
the document() function. I'm unsure of what the XSLT specification means
with the URN. I've tried things like 'EZ722.xml#reis/code',
'EX722.xml/reis/code'. Couldn't get this to work.
Any help on this is welcome.
With kind regards,
Peter Paulus
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list