[xquery-talk] querying attribute?

G. Ken Holman gkholman at CraneSoftwrights.com
Wed Mar 18 20:05:33 PST 2009


At 2009-03-18 13:06 -0400, Thomas R. Jones wrote:
>Hello all, I have the following code:
>
><tests xmlns="http://oval.mitre.org/XMLSchema/oval-definitions-5">
>  <rpminfo_test
>xmlns="http://oval.mitre.org/XMLSchema/oval-definitions-5#linux"
>check="all" comment="apache2 is installed"
>id="oval:com.maitreyasecurity:tst:674" version="1">
>   <object object_ref="oval:com.maitreyasecurity:obj:674"/>
>   <state state_ref="oval:com.maitreyasecurity:ste:500"/>
>  </rpminfo_test>
></tests>
>
>I am trying everything i can think of to return the attribute value but
>am hanging up on the namespace(i think). I believe because the attribute
>is not prefixed that it is located within a NULL namespace and not the
>element default namespace declared----correct?

Yes, that is correct. *All* unprefixed attributes are in no 
namespace, never the default namespace.


>Here is my xquery:
>
>declare default element namespace
>"http://oval.mitre.org/XMLSchema/oval-definitions-5#linux"; for $attr in
>document("apache2.package.novell.maitreyasecurity.en_US.xml","inventory.a")/tests/rpminfo_test/@id 
>return string($attr)
>
>Ideas?

You declare the "#linux" namespace as your default element namespace, 
so it is being applied to *every* element (after all, it is the 
default) which includes the <tests> element.  Your <tests> element is 
in not in the "#linux" namespace, so your problem is it isn't finding 
the element with the attribute, not that it isn't finding the attribute.

I tell my students that using the default namespace can be awkward 
when dealing with an instance of numerous namespaces (as I learned 
the hard way when working with UBL).  I believe it will make 
maintenance easier if you explicitly use prefixes when there is more 
than one namespace in your source tree.

A running example is below ... I hope this helps.

. . . . . . . . . Ken

t:\ftemp>type thomas.xml
<tests xmlns="http://oval.mitre.org/XMLSchema/oval-definitions-5">
  <rpminfo_test
xmlns="http://oval.mitre.org/XMLSchema/oval-definitions-5#linux"
check="all" comment="apache2 is installed"
id="oval:com.maitreyasecurity:tst:674" version="1">
   <object object_ref="oval:com.maitreyasecurity:obj:674"/>
   <state state_ref="oval:com.maitreyasecurity:ste:500"/>
  </rpminfo_test>
</tests>

t:\ftemp>call xquery thomas.xml thomas.xq
<?xml version="1.0" encoding="UTF-8"?>oval:com.maitreyasecurity:tst:674
t:\ftemp>type thomas.xq
declare namespace o =
         "http://oval.mitre.org/XMLSchema/oval-definitions-5";
declare namespace l =
         "http://oval.mitre.org/XMLSchema/oval-definitions-5#linux";
  for $attr in
/o:tests/l:rpminfo_test/@id return string($attr)

t:\ftemp>


--
XQuery/XSLT/XSL-FO training in Los Angeles (New dates!) 2009-06-08
Training tools: Comprehensive interactive XSLT/XPath 1.0/2.0 video
Video lesson:    http://www.youtube.com/watch?v=PrNjJCh7Ppg&fmt=18
Video overview:  http://www.youtube.com/watch?v=VTiodiij6gE&fmt=18
G. Ken Holman                 mailto:gkholman at CraneSoftwrights.com
Crane Softwrights Ltd.          http://www.CraneSoftwrights.com/q/
Male Cancer Awareness Nov'07  http://www.CraneSoftwrights.com/q/bc
Legal business disclaimers:  http://www.CraneSoftwrights.com/legal



More information about the talk mailing list