XML 文件中的 XML 模式声明破坏了 XSLT 转换 [重复]

Posted

技术标签:

【中文标题】XML 文件中的 XML 模式声明破坏了 XSLT 转换 [重复]【英文标题】:XML schema declarations in XML file breaks XSLT transformation [duplicate] 【发布时间】:2020-08-27 04:27:43 【问题描述】:

我有一个 XSD、XML 和 XSLT 文件。

(简化)XML:

<project
xmlns="SYSTEM"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="SYSTEM schema.xsd">

<property name="name1" value="value1">
<property name="name2" value="value2">
</project>

在我的 XSLT 中,我需要使用 &lt;xsl:for-each 标记对 &lt;project&gt; 中的每个元素执行转换。 但是只有当我从&lt;project&gt; 中删除xmlns, xmlns:xsixsi:schemaLocation 属性时,转换才能正常工作。 (我当然在没有这些属性的情况下对其进行了测试,并且效果很好。)

这是错误的结果:

<?xml version="1.0" encoding="UTF-8"?>
<project/>

这是我的 xslt 文件:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:template match="/">
            <project>
            <xsl:for-each select="project/*">
                <property>
                    <xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute>
                    <xsl:attribute name="value"><xsl:value-of select="@value"/></xsl:attribute>
                </property>
            </xsl:for-each>
        </project>
    </xsl:template>
</xsl:stylesheet>

还有我的 xsd 文件的最上面几行:

    <?xml version="1.0"?>
    <xs:schema
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns="SYSTEM" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
    targetNamespace="SYSTEM"
    elementFormDefault="qualified"
    vc:minVersion="1.1">

    <xs:element name="project">

【问题讨论】:

要查找其他 727 位落入同一陷阱的人,请搜索“XSLT 默认命名空间”。 【参考方案1】:

您的 XML 有一个默认命名空间。所以你的 XSLT 需要用一些前缀来定义它。当您引用任何元素时,您需要添加该名称空间前缀。我为此使用了xmlns:a="SYSTEM"

请见下文。

XSLT

<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:a="SYSTEM">

<xsl:template match="/">
    <xsl:value-of select="a:project/a:property"/>
</xsl:template>

</xsl:stylesheet>

【讨论】:

对于示例中的属性,您需要使用不带前缀的名称,例如@name@value,它们不在任何命名空间中。 @MartinHonnen,感谢您的澄清。我调整了提议的解决方案的措辞。

以上是关于XML 文件中的 XML 模式声明破坏了 XSLT 转换 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 XSLT 替换命名空间中的元素?

XSLT 与 Java集成常见技术关键点

CSS Accordion 使用 XML/XSLT 文件中的数据

XSLT - 显示位于不同 XML 文件中的子元素

使用 XSLT 在文本文件 (CSV) 中解析 XML 文件

如何通过abap中的XSLT程序读取XML文件的属性