无法使用命名空间对xml文件中的节点进行排序

时间:2013-01-24 21:04:37

标签: xml xslt

我正在尝试访问.xml文件中的一个节点,该节点使用命名空间并对其进行排序。它不起作用,我认为它与命名空间有关,而且无法正确地限定它们。

我有一个index.xml,用于组合我需要的文档,如下所示:

<?xml version="1.0" encoding="ISO-8859-1"?>

<?xml-stylesheet type="text/xsl" href="merge.xsl"?>

<pic:catalog xmlns:pic = "pictureCatalog">
    <pic:logo>Logo</pic:logo>
    <Author>User Name</Author>
    <pic:allPhotos>photos</pic:allPhotos>
</pic:catalog>

photos.xml看起来像这样:

<?xml version="1.0"?>
<pic:photoCatalog xmlns:pic="pictureCatalog">

    <pic:photo>
           <pic:title>Alcazar</pic:title>
           <pic:location>Segovia - Spain</pic:location>
           <pic:date>Jan 2013</pic:date>
           <pic:camera>Sony</pic:camera>
           <pic:resolution>12px</pic:resolution>
           <pic:format>.jpg</pic:format>
           <pic:description>
            Medieval Castle over the hill overlooking the city.
           </pic:description>
    </pic:photo>

</pic:photoCatalog>

我的xsl样式表看起来像这样:

 <!-- All the photos-->
   <xsl:template match = "pic:catalog/pic:allPhotos">
     <html>
         <head>
            <link rel="stylesheet" type="text/css" href="Style.css" />
         </head>
         <body>

        <xsl:for-each select="pic:photoCatalog/pic:photo"><br/>
              <xsl:sort select="pic:location"/>
              <xsl:value-of select="pic:photoCatalog/pic:photo/pic:location"/>
           </xsl:for-each>

         </body>
   </html>
   </xsl:template>

有人可以帮忙吗?

Bluetxxth

1 个答案:

答案 0 :(得分:0)

这里有两个XML文件,但您的XSLT仅应用于index.xml,并且不在任何地方引用photos.xml。如果要访问第二个XML文档,通常会在XSLT中看到文档引用。

看起来第二个文件名保存在index.xml的 pic:allPhotos 元素中,并且您要访问该文件并迭代照片。在这种情况下,您需要更改 xsl:for-each 以便像这样访问文档

 <xsl:for-each select="document(concat(., '.xml'))/pic:photoCatalog/pic:photo">

下一个问题是,此时您正在 xsl:sort 语句之前输出 br 元素。这是无效的,因为 xsl:sort 应紧跟在 xsl:for-each 之后。

<xsl:for-each select="document(concat(., '.xml'))/pic:photoCatalog/pic:photo">
   <xsl:sort select="pic:location"/>
   <br/>

此外,您的 xsl:value-of 并不完全正确。作为调用的点,您处于 xsl:for-each 循环中,因此已经定位在 pic:photo 元素上,因此它可以简化为此

<xsl:value-of select="pic:location"/>

尝试以下XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:pic="pictureCatalog" exclude-result-prefixes="pic">

   <xsl:template match="/pic:catalog">
      <xsl:apply-templates select="pic:allPhotos"/>
   </xsl:template>

   <xsl:template match="pic:catalog/pic:allPhotos">
      <html>
         <head>
            <link rel="stylesheet" type="text/css" href="Style.css"/>
         </head>
         <body>
            <xsl:for-each select="document(concat(., '.xml'))/pic:photoCatalog/pic:photo">
               <xsl:sort select="pic:location"/>
               <br/>
               <xsl:value-of select="pic:location"/>
            </xsl:for-each>
         </body>
      </html>
   </xsl:template>
</xsl:stylesheet>

哪个输出以下

<html>
<head>
<META http-equiv="Content-Type" content="text/html">
<link rel="stylesheet" type="text/css" href="Style.css">
</head>
<body><br>Segovia - Spain</body>
</html>

顺便说一句,你的命名空间都存在且正确! (好吧,假设你已经在 xsl:stylesheet 上声明了它已经更正了)