如何使用XSLT读取命名空间声明?

时间:2014-03-17 02:59:58

标签: xslt xpath

我必须以可扩展/可折叠节点的树形式转换任何 OData feed(ATOM)的原始响应。为此,我使用XSLT转换将原始响应转换为HTML。

问题是来自某些服务的响应将feed元素与名称空间声明作为属性。 (例如:feed xmlns:d = ...,xmlns:m = ...)。在我的最终输出中,这些命名空间声明不会显示。

XSLT处理器在处理属性时忽略它们。(我使用XPath表达式“@ *”。)有没有办法使用XSLT提取它们并在转换输出中按原样显示命名空间声明内容? / p>

请注意,我在OData响应中了解运行时的这些命名空间声明属性。在查询执行之前我没有任何信息。

更新:

输入 :( RAW XML条目)

<?xml version="1.0" encoding="utf-8"?><entry xml:base="http://services.odata.org/Northwind/Northwind.svc/" xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"><id>http://services.odata.org/Northwind/Northwind.svc/Regions(1)</id><category term="NorthwindModel.Region" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" /><link rel="edit" title="Region" href="Regions(1)" /><link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Territories" type="application/atom+xml;type=feed" title="Territories" href="Regions(1)/Territories" /><title /><updated>2014-03-17T10:24:14Z</updated><author><name /></author><content type="application/xml"><m:properties><d:RegionID m:type="Edm.Int32">1</d:RegionID><d:RegionDescription xml:space="preserve">Eastern                                           </d:RegionDescription></m:properties></content></entry>

所需输出 :(相同的ATOM条目,作为XML树,使用可扩展/可折叠节点打印)

-<entry xml:base="http://services.odata.org/Northwind/Northwind.svc/" xmlns="http://www.w3.org/2005/Atom" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">

-<id>
   http://services.odata.org/Northwind/Northwind.svc/Regions(1)
</id>
<category term="NorthwindModel.Region" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"/>
<link rel="edit" title="Region" href= "Regions(1)" />
<link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Territories" type="application/atom+xml;type=feed" title="Territories" href= "Regions(1)/Territories" />
<title/>
<updated>2014-03-17T10:06:25Z</updated>

-<author>
   <name/>
</author>

-<content type="application/xml">

-<m:properties>
   <d:RegionID m:type="Edm.Int32">1</d:RegionID>
   <d:RegionDescription xml:space="preserve">Eastern </d:RegionDescription>
</m:properties>
</content>
</entry>

我得到的输出。

    -<entry xml:base="http://services.odata.org/Northwind/Northwind.svc/">

    -<id>
        http://services.odata.org/Northwind/Northwind.svc/Regions(1)
    </id>
    <category term="NorthwindModel.Region"    scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme"/>
    <link rel="edit" title="Region" href= "Regions(1)" />
    <link rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/Territories" type="application/atom+xml;type=feed" title="Territories" href= "Regions(1)/Territories" />
    <title/>
    <updated>2014-03-17T10:06:25Z</updated>

    -<author>
        <name/>
    </author>

    -<content type="application/xml">

    -<m:properties>
       <d:RegionID m:type="Edm.Int32">1</d:RegionID>
       <d:RegionDescription xml:space="preserve">Eastern </d:RegionDescription>
    </m:properties>
    </content>
    </entry>

请注意输出的“entry”根元素中缺少名称空间声明。

输出是一个显示精美打印的xml的HTML,具有可扩展/可折叠节点,并且由于它应按原样显示数据,因此需要在输出HTML中显示命名空间声明。 单击“ - ”符号会折叠节点。

3 个答案:

答案 0 :(得分:0)

如果声明已经在范围内(请记住,名称空间绑定会继承到子级),则不需要重新声明它,并且大多数XML序列化程序都不会生成它。你还没有向我们展示一个例子,但我敢打赌你的输出很好。

答案 1 :(得分:0)

源XML中的命名空间声明在XPath数据模型中显示为命名空间节点(不是属性节点)。

您需要明确要对命名空间执行的操作。您是说您正在生成HTML,但您也说要将命名空间复制到输出中。这似乎不一致。向我们展示您输入和所需的输出。

答案 2 :(得分:0)

我还没有设法发现你的实际输出和你想要的输出之间的差异(从来没有非常擅长&#34;发现球和#34;比赛),但是从你修改过的问题描述中听起来好像你应该使用命名空间轴来查找元素的范围内命名空间(与你当前使用属性轴的方式相同)。

唯一棘手的部分是命名空间轴将为您提供元素的所有命名空间,您可能只想显示那些与父元素的命名空间不同的命名空间。

详细信息取决于您使用的是XSLT 1.0还是2.0 - 您需要告诉我们!