将XSLT应用于具有多个名称空间的根元素?

时间:2018-04-20 21:00:55

标签: xml xslt xslt-1.0

我使用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文件尽可能未经编辑。

1 个答案:

答案 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>