1

在 Firefox 上,我收到错误加载样式表:处理 XPath 表达式失败。但在 Chrome 中没有显示任何内容。

对象商店.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>

对象商店.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>

对象商店.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:osfrom objectshop.xml复制到 objectshop.xslxsl:stylesheet标记中的错误。

请注意,重要的是命名空间 URI,而不是前缀。您可以xmlns:s="http://www.example.org/objectshop"在样式表中声明,然后/s:product在您的 xpaths 中使用,它仍然会匹配<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 回答