1

Firefox では、スタイルシートの読み込み中にエラーが発生しました: XPath 式の処理に失敗しました。しかしChromeでは何も表示されません。

objectshop.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="objectshop.xsl" ?>

<os:objectshop xmlns:os="http://www.example.org/objectshop"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.example.org/objectshop objectshop.xsd ">
  <os:catalog>
    <os:product>
        <os:productId>1</os:productId>
        <os:name>Achtung Baby - U2</os:name>
        <os:description>Audio CD</os:description>
        <os:price>21.0</os:price>
        <os:campaignPrice>19.0</os:campaignPrice>
        <os:icon>images/u2AchtungBaby.jpg</os:icon>
    </os:product>
    <os:product>
        <os:productId>2</os:productId>
        <os:name>Achtung Baby - U2</os:name>
        <os:description>Audio CD</os:description>
        <os:price>21.0</os:price>
        <os:campaignPrice>19.0</os:campaignPrice>
        <os:icon>images/u2AchtungBaby.jpg</os:icon>
    </os:product>
    <os:product>
        <os:productId>2</os:productId>
        <os:name>Achtung Baby - U2</os:name>
        <os:description>Audio CD</os:description>
        <os:price>21.0</os:price>
        <os:campaignPrice>19.0</os:campaignPrice>
        <os:icon>images/u2AchtungBaby.jpg</os:icon>
    </os:product>
    <os:product>
        <os:productId>4</os:productId>
        <os:name>Achtung Baby - U2</os:name>
        <os:description>Audio CD</os:description>
        <os:price>21.0</os:price>
        <os:campaignPrice>19.0</os:campaignPrice>
        <os:icon>images/u2AchtungBaby.jpg</os:icon>
    </os:product>
  </os:catalog>
  <os:members>
    <os:customer>
        <os:userId>eteration</os:userId>
        <os:name>Esma Meral</os:name>
        <os:address>ITU andesea</os:address>
        <os:phone>+90 123 456 789</os:phone>
        <os:email>a@b.com</os:email>
    </os:customer>
  </os:members>
</os:objectshop>

objectshop.xsl

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.1"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <html>
      <body>
        <div id="headerregion">
        </div>

        <div id="middleregion">
          <div id="middle">
            <div id="sidebar">
              ...
            </div>
            <div id="content">
              <xsl:apply-templates select="/os:objectshop/os:catalog" />
            </div>
          </div>
        </div>
        <div id="footerregion">
          Something
        </div>
      </body>
    </html>
  </xsl:template>
  <xsl:template match="/os:objectshop/os:catalog">
    <table align="center">
      <xsl:for-each select="//os:product">
        <xsl:sort select="os:productId" />
        <tr valign="top">
          <td valign="top">
            <b>
              <xsl:value-of select="os:productId" />
            </b>
          </td>
          <td>
            <img>
              <xsl:attribute name="height">50</xsl:attribute>
              <xsl:attribute name="width">50</xsl:attribute>
              <xsl:attribute name="align">top</xsl:attribute>
              <xsl:attribute name="border">0</xsl:attribute>
              <xsl:attribute name="src">
                  <xsl:value-of select="os:icon" />
                </xsl:attribute>
              xsl:attribute>
            </img>
          </td>
          <td>
            <b>
              <xsl:value-of select="os:name" />
            </b>
            <xsl:value-of select="os:description" />
            <br />
            Retail Price $
            <xsl:value-of select="os:price" />
            <br />
            <font color="RED">
              <b>
                Our Price $
                <xsl:value-of select="os:price" />
              </b>
            </font>
          </td>
        </tr>
        <tr>
          <td colspan="3">
            <img height="1" src="images/grey-pixel.gif" width="100%"
              align="top" vspace="6" />
          </td>
        </tr>
      </xsl:for-each>
    </table>
  </xsl:template>
</xsl:stylesheet>

objectshop.xsd

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
 targetNamespace="http://www.example.org/objectshop"
 elementFormDefault="qualified"
 xmlns:os="http://www.example.org/objectshop">

    <complexType name="ProductType">
        <sequence>
            <element name="productId" type="string"></element>
            <element name="name" type="string"></element>
            <element name="description" type="string"></element>
            <element name="price" type="double"></element>
            <element name="campaignPrice" type="double"></element>
            <element name="icon" type="string"></element>
        </sequence>
    </complexType>

    <complexType name="CustomerType">
        <sequence>
            <element name="userId" type="string"></element>
            <element name="name" type="string"></element>
            <element name="address" type="string"></element>
            <element name="phone" type="string"></element>
            <element name="email" type="string"></element>
        </sequence>
    </complexType>

    <complexType name="CatalogType">
        <sequence>
            <element name="product" type="os:ProductType"
                minOccurs="0" maxOccurs="unbounded">
            </element>
        </sequence>
    </complexType>

    <complexType name="MembersType">
        <sequence>
            <element name="customer" type="os:CustomerType" minOccurs="0" maxOccurs="unbounded"></element>
        </sequence>
    </complexType>

    <element name="objectshop" type="os:ObjectShopType"></element>

    <complexType name="ObjectShopType">
        <sequence>
            <element name="catalog" type="os:CatalogType"></element>
            <element name="members" type="os:MembersType"></element>
        </sequence>
    </complexType>
</schema>
4

2 に答える 2

3

XPath 式の名前空間プレフィックスは、ソース ドキュメントではなく、スタイルシートで宣言された名前空間を参照します。os:宣言されていない xpaths でプレフィックスを使用しています。エラーを修正するにはxmlns:os、objectshop.xml から objectshop.xsl のxsl:stylesheetタグにコピーする必要があります。

重要なのは、プレフィックスではなく名前空間 URI であることに注意してください。xmlns:s="http://www.example.org/objectshop"スタイルシートで宣言してから xpath で使用できますが、名前空間が正しいため、ソース ドキュメント/s:productの と一致します。<os:product>

于 2013-03-24T10:25:45.513 に答える
0

修正されたコードは次のとおりです(名前空間の定義が追加されています)。

<xsl:stylesheet version="1.1"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:os="http://www.example.org/objectshop">
  <xsl:template match="/">
    <html>
      <body>
        <div id="headerregion">
        </div>

        <div id="middleregion">
          <div id="middle">
            <div id="sidebar">
              ...
            </div>
            <div id="content">
              <xsl:apply-templates select="/os:objectshop/os:catalog" />
            </div>
          </div>
        </div>
        <div id="footerregion">
          Something
        </div>
      </body>
    </html>
  </xsl:template>
  <xsl:template match="/os:objectshop/os:catalog">
    <table align="center">
      <xsl:for-each select="//os:product">
        <xsl:sort select="os:productId" />
        <tr valign="top">
          <td valign="top">
            <b>
              <xsl:value-of select="os:productId" />
            </b>
          </td>
          <td>
            <img>
              <xsl:attribute name="height">50</xsl:attribute>
              <xsl:attribute name="width">50</xsl:attribute>
              <xsl:attribute name="align">top</xsl:attribute>
              <xsl:attribute name="border">0</xsl:attribute>
              <xsl:attribute name="src">
                  <xsl:value-of select="os:icon" />
                </xsl:attribute>
              xsl:attribute>
            </img>
          </td>
          <td>
            <b>
              <xsl:value-of select="os:name" />
            </b>
            <xsl:value-of select="os:description" />
            <br />
            Retail Price $
            <xsl:value-of select="os:price" />
            <br />
            <font color="RED">
              <b>
                Our Price $
                <xsl:value-of select="os:price" />
              </b>
            </font>
          </td>
        </tr>
        <tr>
          <td colspan="3">
            <img height="1" src="images/grey-pixel.gif" width="100%"
              align="top" vspace="6" />
          </td>
        </tr>
      </xsl:for-each>
    </table>
  </xsl:template>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると、次のようになります。

<os:objectshop xmlns:os="http://www.example.org/objectshop"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.example.org/objectshop objectshop.xsd ">
    <os:catalog>
        <os:product>
            <os:productId>1</os:productId>
            <os:name>Achtung Baby - U2</os:name>
            <os:description>Audio CD</os:description>
            <os:price>21.0</os:price>
            <os:campaignPrice>19.0</os:campaignPrice>
            <os:icon>images/u2AchtungBaby.jpg</os:icon>
        </os:product>
        <os:product>
            <os:productId>2</os:productId>
            <os:name>Achtung Baby - U2</os:name>
            <os:description>Audio CD</os:description>
            <os:price>21.0</os:price>
            <os:campaignPrice>19.0</os:campaignPrice>
            <os:icon>images/u2AchtungBaby.jpg</os:icon>
        </os:product>
        <os:product>
            <os:productId>2</os:productId>
            <os:name>Achtung Baby - U2</os:name>
            <os:description>Audio CD</os:description>
            <os:price>21.0</os:price>
            <os:campaignPrice>19.0</os:campaignPrice>
            <os:icon>images/u2AchtungBaby.jpg</os:icon>
        </os:product>
        <os:product>
            <os:productId>4</os:productId>
            <os:name>Achtung Baby - U2</os:name>
            <os:description>Audio CD</os:description>
            <os:price>21.0</os:price>
            <os:campaignPrice>19.0</os:campaignPrice>
            <os:icon>images/u2AchtungBaby.jpg</os:icon>
        </os:product>
    </os:catalog>
    <os:members>
        <os:customer>
            <os:userId>eteration</os:userId>
            <os:name>Esma Meral</os:name>
            <os:address>ITU andesea</os:address>
            <os:phone>+90 123 456 789</os:phone>
            <os:email>a@b.com</os:email>
        </os:customer>
    </os:members>
</os:objectshop>

(と思われる) 正しい、必要な結果が生成されます。

<html xmlns:os="http://www.example.org/objectshop">
   <body>
      <div id="headerregion"></div>
      <div id="middleregion">
         <div id="middle">
            <div id="sidebar">
               ...

            </div>
            <div id="content">
               <table align="center">
                  <tr valign="top">
                     <td valign="top"><b>1</b></td>
                     <td><img height="50" width="50" align="top" border="0" src="images/u2AchtungBaby.jpg">
                           xsl:attribute&gt;
                           </td>
                     <td><b>Achtung Baby - U2</b>Audio CD<br>
                        Retail Price $
                        21.0<br><font color="RED"><b>
                              Our Price $
                              21.0</b></font></td>
                  </tr>
                  <tr>
                     <td colspan="3"><img height="1" src="images/grey-pixel.gif" width="100%" align="top" vspace="6"></td>
                  </tr>
                  <tr valign="top">
                     <td valign="top"><b>2</b></td>
                     <td><img height="50" width="50" align="top" border="0" src="images/u2AchtungBaby.jpg">
                           xsl:attribute&gt;
                           </td>
                     <td><b>Achtung Baby - U2</b>Audio CD<br>
                        Retail Price $
                        21.0<br><font color="RED"><b>
                              Our Price $
                              21.0</b></font></td>
                  </tr>
                  <tr>
                     <td colspan="3"><img height="1" src="images/grey-pixel.gif" width="100%" align="top" vspace="6"></td>
                  </tr>
                  <tr valign="top">
                     <td valign="top"><b>2</b></td>
                     <td><img height="50" width="50" align="top" border="0" src="images/u2AchtungBaby.jpg">
                           xsl:attribute&gt;
                           </td>
                     <td><b>Achtung Baby - U2</b>Audio CD<br>
                        Retail Price $
                        21.0<br><font color="RED"><b>
                              Our Price $
                              21.0</b></font></td>
                  </tr>
                  <tr>
                     <td colspan="3"><img height="1" src="images/grey-pixel.gif" width="100%" align="top" vspace="6"></td>
                  </tr>
                  <tr valign="top">
                     <td valign="top"><b>4</b></td>
                     <td><img height="50" width="50" align="top" border="0" src="images/u2AchtungBaby.jpg">
                           xsl:attribute&gt;
                           </td>
                     <td><b>Achtung Baby - U2</b>Audio CD<br>
                        Retail Price $
                        21.0<br><font color="RED"><b>
                              Our Price $
                              21.0</b></font></td>
                  </tr>
                  <tr>
                     <td colspan="3"><img height="1" src="images/grey-pixel.gif" width="100%" align="top" vspace="6"></td>
                  </tr>
               </table>
            </div>
         </div>
      </div>
      <div id="footerregion">
         Something

      </div>
   </body>
</html>
于 2013-03-24T15:22:51.833 に答える