我使用XML和XSLT的经验非常有限。我正在使用大量(大约4,000个)高度标准化的XML文件。我对编辑XML文件非常犹豫,而我只想编写一个XSLT文件来很好地显示标记。我遇到的问题是根元素在其上声明了几个名称空间。
当只有一个命名空间时,一切正常。
XML:
<?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>
XSLT:
<?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:
{{1}}
我想要获得的结果是AUTHOR的TITLE的纯文本声明,位于CALL NUMBER。但是当我将第二个XML文件附加到以前的XSLT文件时,它不再正确显示。我假设这是因为第二个名称空间声明,因为这是唯一改变的东西。我希望得到原始结果,即使是第二个命名空间defalcation。
我不想删除额外的命名空间,因为它们是标准的一部分(美国国会图书馆的MARCXML标准)。我想保留原始XML文件尽可能未经编辑。
答案 0 :(得分:1)
每当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>