Вопрос

I have a (simplified) XML file I'm trying to transform:

<?xml version='1.0' encoding='UTF-8'?>
<entry xmlns="http://www.symplectic.co.uk/vivo/" xmlns:api="http://www.symplectic.co.uk/publications/api">
<tag>Hello, Hello.</tag>
</entry>

Wrapping my content in the "entry" tag seems to cause problems with this statement in my XSLT.

<xsl:value-of select="$xmlfile/entry/tag"/>

Where the $xmlFile is the fn:document output of the above XML. I have found that when removing the entry tags from the XML and simply modifying my XSLT to:

<xsl:value-of select="$xmlfile/tag"/>

I get the content (Hello,Hello) I'm expecting in my output. I have verified that doing a copy-of $xmlfile returns the full XML file. I'm sure there is something I'm not doing right syntactically as I'm new to XSL. Any advice would be appreciated.

Thanks!

Это было полезно?

Решение

The issue is indeed with the entry element...

<entry xmlns="http://www.symplectic.co.uk/vivo/"

The xmlns attribute here is actually a namespace declaration. Or rather, because it does declare a prefix (like xmlns:api does) it is the default namespace. This means the entry element and its child tag element belong to the namespace.

Now, your xslt is doing this...

<xsl:value-of select="$xmlfile/entry/tag"/>

This is looking for entry and tag elements that belong to NO namespace. These are different to elements with the same name that do belong to a namespace.

The solution is to declare the namespace, with a prefix, in the XSLT, like so

<xsl:stylesheet version="1.0" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
     xmlns:vivo="http://www.symplectic.co.uk/vivo/">

Then change your xslt expression to look like this

<xsl:value-of select="$xmlfile/vivo:entry/vivo:tag"/>

Note the actual prefix is no important, but the namespace url must match.

Другие советы

XPath and XSLT are namespace-aware. To specify a namespaced node in a path, you should give the node name a prefix that you have bound to the correct namespace.

Using wildcards, and then adding a predicate to test only the localname, is possible but generally the Wrong Answer. Namespaces are a meaningful part of the name. Use them properly.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top