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>

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

4

1 に答える 1

0

ここには2つのXMLファイルがありますが、XSLTはindex.xmlにのみ適用され、photos.xmlへの参照はどこにもありません。通常、2番目のXMLドキュメントにアクセスする場合は、XSLTでドキュメント参照を表示することを期待します。

2番目のファイル名が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 に答える