XML 文件中的 XML 模式声明中断了 XSLT 转换
XML schema declarations in XML file breaks XSLT transformation
我有一个 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 中,我需要使用 <xsl:for-each
标记对 <project>
中的每个元素执行转换。
但是只有当我从 <project>
中删除 xmlns, xmlns:xsi
和 xsi: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">
您的 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>
我有一个 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 中,我需要使用 <xsl:for-each
标记对 <project>
中的每个元素执行转换。
但是只有当我从 <project>
中删除 xmlns, xmlns:xsi
和 xsi: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">
您的 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>