当前位置: 首页 > 知识库问答 >
问题:

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

蔚楷
2023-03-14

我正在尝试创建一个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个答案

荀嘉熙
2023-03-14

在XSLT 2.0中:只需在xsl:stylesheet元素中添加以下属性:xpath默认名称空间=”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>
 类似资料:
  • 我有这个xml是架构版本3.0http://www.test.com/Service/v3。我需要将其降级到版本1http://www.test.com/Service/v1.为此,我使用XSL来转换它。 但我得到这样的结果 在我的输出XML中,我得到了这个 为什么将其添加到NS2:消息中? 它不在输入xml中。 我遗漏了一些东西。如果有人能指出这个问题,我将不胜感激。 我希望在输出中创建以下内容

  • 我试图用XSLT处理器在PHP中转换xml文档,但我无法选择任何内容。。。我认为这是一个名称空间问题。如果我从一个干净的<代码> inputxml: Xsl-file: 我无法更改输入文件,因为它是由其他程序生成的。 安德烈

  • 我是XSLT的新手,命名空间有问题。这是我必须转换的XML: 我正在使用以下XSLT: 结果是: 我试图删除结果输入顺序中的名称空间,但它不适合我。有人能帮我学习XSLT吗?谢谢

  • 我需要一个简单的xslt,它接受输入并提供如下所述的输出。我已经编写了xslt,但名称空间被忽略了。你能帮我一下吗。 输入消息: 预期输出消息: 实际输出消息: XSLT:

  • 我试图将Excel xml文件的一部分呈现为超文本标记语言,以便在翻译(外语翻译)计算机辅助翻译工具中的部分内容时改进预览。 我有以下xml: 我试图从每行中提取第二个数据元素并显示它,但我根本无法显示它。我认为这与名称空间有关,我肯定遗漏了什么,但看不出是什么。这就是我正在使用的: 有人能帮我吗? 我应该补充一点,我正在使用Treebeard来测试这个,它用这些错误验证xml(我无法控制)...

  • 如果我删除所有命名空间和前缀,我的XSLT转换将完美运行。 我曾尝试过几次引入名称空间,但最终总是出现某种错误或没有输出,因此我在这里寻求一些帮助和理解。 我的预期输出,缩减为命名空间和前缀,是: 再次缩减的XML输入是: 为了实现正确的命名空间转换,我需要向XSLT头中添加什么?