English 中文(简体)
Iterate through XML nodes that have xmlns attribute declared in a XSL
原标题:

I am working on creating an XSL to format some incoming XML from an API I am integrating. The xml I receive looks like:

<items>
  <item xmlns="http://www.tempuri.org/Item.xsd">
    <key>value</key>
  </item>
  <item>
    <key>value</key>
  </item>
  <item xmlns="http://www.tempuri.org/Item.xsd">
    <key>value</key>
  </item>
</items>

Some of the "item" nodes have the "xmlns" attribute defined, while others do not. When I attempt to iterate through the results in my XSL, it is not finding the nodes that have the xmlns attribute defined.

<xsl:for-each select="item">
  <xsl:value-of select="key" />
</xsl:for-each>

I am sort of new to the whole XSL thing, so I m not sure what I am doing wrong.

最佳回答

You ll need to define the same namespace in your <xsl:stylesheet> definition.

Then:

<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ns="http://www.tempuri.org/Item.xsd"
    extension-element-prefixes="exsl"
    encoding="utf-8">

. . .

<xsl:for-each select="item|ns:item">
    <xsl:value-of select="key|ns:key"/>
</xsl:for-each>

Really you should try and use the same namespace for things that are the same.

问题回答

First off, if you don t understand how XML namespaces work and what they mean, you re going to have no end of problems. This issue you re struggling with is the tip of the iceberg.

That said, you can deal with namespaces the way Kyle Butt suggested, assigning a transform-wide mapping of prefixes to namespaces in the stylesheet element and then using the prefixes in your XPath expression.

But what if you don t know the namespaces? Then you have to use a blunter instrument:

<xsl:for-each select="*[local-name()= item ]">
  <xsl:value-of select="*[local-name()= key ]"/>
</xsl:for-each>

Using local-name() ignores namespaces completely. But you can t use it in a node test (which has to be a name like foo or a qualified name like x:foo), you can only use it in a predicate. Which is why the unlovely *[local-name()= foo ] is the only way to do it.





相关问题
how to represent it in dtd?

I have two element action and guid. guid is a required field when action is add. but when action is del it will not appear in file. How to represent this in dtd ?

.Net application configuration add xml-data

I need to add xml-content to my application configuration file. Is there a way to add it directly to the appSettings section or do I need to implement a configSection? Is it possible to add the xml ...

XStream serializing collections

I have a class structure that I would like to serialize with Xstream. The root class contains a collection of other objects (of varying types). I would like to only serialize part of the objects that ...

MS Word splits words in its XML format

I have a Word 2003 document saved as a XML in WordProcessingML format. It contains few placeholders which will be dynamically replaced by an appropriate content. But, the problem is that Word ...

Merging an XML file with a list of changes

I have two XML files that are generated by another application I have no control over. The first is a settings file, and the second is a list of changes that should be applied to the first. Main ...

How do I check if a node has no siblings?

I have a org.w3c.dom.Node object. I would like to see if it has any other siblings. Here s what I have tried: Node sibling = node.getNextSibling(); if(sibling == null) return true; else ...

Ordering a hash to xml: Rails

I m building an xml document from a hash. The xml attributes need to be in order. How can this be accomplished? hash.to_xml

热门标签