XSLT转换无法解决如何包含命名空间?

时间:2012-04-26 10:11:01

标签: xml xslt

我正在尝试创建一个XSLT文件,我可以让它工作而不在任一文件中包含命名空间,但只要我在其中包含,它就会停止工作。 这是我正在使用的例子。

我的XML文件            

  <cd>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <country>USA</country>
    <company>Columbia</company>
    <price>10.90</price>
    <year>1985</year>
  </cd>
  <cd>
    <title>Empire sdf</title>
    <artist>Bob sdf</artist>
    <country>2</country>
    <company>asdfs</company>
    <price>12.90</price>
    <year>1935</year>
  </cd>
</catalog>

我的转换文件。

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

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
  <html><body><table border="1">
    <tr bgcolor="#9acd32"><th>Title</th><th>Artist</th></tr>
    <xsl:for-each select="catalog/cd">
    <tr>   
      <td><xsl:value-of select="title"/></td>
      <td><xsl:value-of select="artist"/></td>
    </tr>
    </xsl:for-each>
  </table></body></html>
</xsl:template>

</xsl:stylesheet>

我的结果

<?xml version="1.0" encoding="UTF-8"?>
<html>
    <body>
        <table border="1">
            <tr bgcolor="#9acd32">
                <th>Title</th>
                <th>Artist</th>
            </tr>
            <tr>
                <td>Empire Burlesque</td>
                <td>Bob Dylan</td>
            </tr>
            <tr>
                <td>Empire sdf</td>
                <td>Bob sdf</td>
            </tr>
        </table>
    </body>
</html>

不,如果我改变上述内容。 我的新XML文件

<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog
xmlns="http://www.someurl.com/v3.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.someurl.com/v3.0 ../someschema.xsl"
>

  <cd>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <country>USA</country>
    <company>Columbia</company>
    <price>10.90</price>
    <year>1985</year>
  </cd>
  <cd>
    <title>Empire sdf</title>
    <artist>Bob sdf</artist>
    <country>2</country>
    <company>asdfs</company>
    <price>12.90</price>
    <year>1935</year>
  </cd>
</catalog>

我的新转化文件。

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

        <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.someurl.com/v3.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.someurl.com/v3.0 ../someschema.xsl">
        <xsl:output method="xml" indent="yes"/>
        <xsl:template match="/">
          <html><body><table border="1">
            <tr bgcolor="#9acd32"><th>Title</th><th>Artist</th></tr>
            <xsl:for-each select="catalog/cd">
            <tr>   
              <td><xsl:value-of select="title"/></td>
              <td><xsl:value-of select="artist"/></td>
            </tr>
            </xsl:for-each>
          </table></body></html>
        </xsl:template>

        </xsl:stylesheet>

我现在在转换后的文件中没有数据? 请原谅,如果这个问题是基本的,我没有使用XSLT的经验,而且我正试图绕过它。

1 个答案:

答案 0 :(得分:1)

在XSLT 2.0中:您只需在xsl:stylesheet元素中添加以下属性:xpath-default-namespace="http://www.someurl.com/v3.0"

使用XSLT 1.0:您必须通过提供前缀来限定xsl文件中的命名空间。示例如下:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:ns="http://www.someurl.com/v3.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.someurl.com/v3.0 ../someschema.xsl">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/">
        <html><body><table border="1">
            <tr bgcolor="#9acd32"><th>Title</th><th>Artist</th></tr>
            <xsl:for-each select="ns:catalog/ns:cd">
                <tr>   
                    <td><xsl:value-of select="ns:title"/></td>
                    <td><xsl:value-of select="ns:artist"/></td>
                </tr>
            </xsl:for-each>
        </table></body></html>
    </xsl:template>

</xsl:stylesheet>