我使用 XML 和 XSLT 的经验非常有限。我正在使用大量(大约 4,000 个)高度标准化的 XML 文件。我对编辑 XML 文件非常犹豫,相反,我只想编写一个 XSLT 文件以很好地显示标签。我遇到的问题是根元素上声明了多个命名空间。
当只有一个命名空间时,一切正常。
.XML:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="ex10.xsl"?>
<record xmlns="http://www.loc.gov/MARC21/slim">
<LCCN>05040166</LCCN>
<call>GN800.B62</call>
<author>Edward Thomas Stevens</author>
<title>Flint chips</title>
<publisher>London: Bell and Daldy, 1870.</publisher>
<subject>Archaeology--Stone age.</subject>
</record>
XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:a="http://www.loc.gov/MARC21/slim" exclude-result-prefixes="a" version="1.0">
<xsl:output method="html"/>
<xsl:template match="/">
<html>
<body>
<p>
<xsl:value-of select="a:record/a:title"/>
by <xsl:value-of select="a:record/a:author"/>
, located <xsl:value-of select="a:record/a:call"/>
</p>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
但是当根元素上再声明一个命名空间时,我不知道该怎么办。
.XML:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="ex10.xsl"?>
<record xmlns="http://www.loc.gov/MARC21/slim" xmlns:cinclude="http://apache.org/cocoon/include/1.0">
<LCCN>05040166</LCCN>
<call>GN800.B62</call>
<author>Edward Thomas Stevens</author>
<title>Flint chips</title>
<publisher>London: Bell and Daldy, 1870.</publisher>
<subject>Archaeology--Stone age.</subject>
</record>
我试图得到的结果是作者标题的纯文本声明,位于呼叫号码。但是,当我将第二个 XML 文件附加到以前的 XSLT 文件时,它不再正确显示。我假设这是因为第二个命名空间声明,因为这是唯一改变的事情。即使使用第二个命名空间定义,我也想获得原始结果。
我不想删除额外的命名空间,因为它们是标准(国会图书馆的 MARCXML 标准)的一部分。我想尽可能保持原始XML文件未经编辑。
每当 XML 中有一个没有前缀的命名空间时,都必须将其放入带有前缀的 XSLT 样式表标记中。 而且您不能添加用于排除结果前缀的前缀。 相反,您必须在代码中使用前缀来引用该命名空间中的元素。 在下面的代码中,我将模板匹配中的"/"更改为"record",因此我可以使用命名空间。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:a="http://www.loc.gov/MARC21/slim"
xmlns:cinclude="http://apache.org/cocoon/include/1.0"
exclude-result-prefixes="cinclude" version="1.0">
<xsl:output method="html"/>
<xsl:template match="a:record">
<html>
<body>
<p>
<xsl:value-of select="a:title"/>
by <xsl:value-of select="a:author"/>
, located <xsl:value-of select="a:call"/>
</p>
</body>
</html>
</xsl:template>