【问题标题】:xsl transform problem when referencing xsd in xml在 xml 中引用 xsd 时出现 xsl 转换问题
【发布时间】:2011-01-06 03:00:58
【问题描述】:

我是 XSL 的新手,需要帮助解决转换问题。我有一个由 XSD 描述的 XML 文件。我使用 XSL 文件将 XML 转换为 HTML。我想在 XML 文件中引用 XSD,但是当我这样做时,XML 没有得到转换。

示例 XML:

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

<root>
<!--
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://localhost" xsi:schemaLocation="http://localhost example.xsd">
-->
  <element>Element 1</element>
  <element>Element 2</element>
  <element>Element 3</element>
</root>

XSL 示例:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="/">
    <ul>
      <xsl:for-each select="root/element">
        <li><xsl:value-of select="."/></li>
      </xsl:for-each>
    </ul>
  </xsl:template>
</xsl:stylesheet>

XSD 示例:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema 
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  targetNamespace="http://localhost"
  xmlns="http://localhost"
  elementFormDefault="qualified">
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="element" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

在 XML 中,如果我使用注释掉的根标记,Firefox 和 Chrome 不会转换 xml。但是,如果我只使用普通的 标签,则转换会很好。

如果我在 XML 中引用 XSD,谁能解释为什么 XSL 转换不会发生?任何帮助表示赞赏!

【问题讨论】:

  • 好问题,+1。请参阅我的答案以获取解释和完整解决方案。 :)
  • 除了@Dimitre 正确答案,请注意,可以为 null(或空)命名空间 URI 下的元素定义架构

标签: xml xslt xsd


【解决方案1】:
<!-- <root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://localhost" xsi:schemaLocation="http://localhost example.xsd"> -->

这与使用 XML Schema 无关。问题是您指定了默认命名空间

在默认命名空间中对节点名称使用 XPath 表达式是最大的 XPath 常见问题解答。

请在 xpath 和 xslt 标签中搜索“默认命名空间”,您会找到很多好的答案。

XSLT 的解决方案 是声明一个带有一些前缀(比如“x”)的名称空间和与 XML 文档中默认名称空间的名称空间 uri 相同的名称空间 uri。然后在任何 XPath 表达式中使用x:name 而不是name

这样你的 XSLT 代码就变成了

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:x="http://localhost" exclude-result-prefixes="x" >

    <xsl:template match="/">
        <ul>
            <xsl:for-each select="x:root/x:element">
                <li>
                    <xsl:value-of select="."/>
                </li>
            </xsl:for-each>
        </ul>
    </xsl:template>
</xsl:stylesheet>

当应用于提供的带有未注释 &lt;root&gt; 元素的 XML 文档时:

<root xmlns="http://localhost"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://localhost example.xsd"> 
    <element>Element 1</element>
    <element>Element 2</element>
    <element>Element 3</element>
</root>

产生想要的正确结果

<ul>
    <li>Element 1</li>
    <li>Element 2</li>
    <li>Element 3</li>
</ul>

【讨论】:

  • 感谢您的详细而有帮助的回答!一旦我有足够的声誉,我会给它+1
猜你喜欢
  • 2011-06-13
  • 2014-08-11
  • 1970-01-01
  • 1970-01-01
  • 2017-02-18
  • 2011-03-15
  • 2020-04-06
  • 2021-05-07
  • 2021-02-08
相关资源
最近更新 更多