0

我正在尝试访问使用命名空间的 .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>

照片.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>

任何人都可以帮忙吗?

蓝牙

4

1 回答 1

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上声明它已更正)

于 2013-01-24T23:15:11.710 回答