1

我有以下一段 XML:

<?xml version="1.0"?>
<document xmlns="http://cnx.rice.edu/cnxml" xmlns:md="http://cnx.rice.edu/mdml" id="new" cnxml-version="0.7" module-id="new">

<metadata xmlns:md="http://cnx.rice.edu/mdml"
      mdml-version="0.5">

    <md:abstract>By the end of this section, you will be able to:
        <list>
            <item>Discuss the role of homeostasis in healthy functioning</item>
            <item>Contrast negative and positive feedback, giving one physiologic example of each mechanism</item>
        </list>
    </md:abstract>

我需要将模板应用于md:abstract元素。我有以下 XSL 代码:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:md="http://cnx.rice.edu/mdml/0.4">

<xsl:output omit-xml-declaration="yes" encoding="ASCII"/>

<xsl:template match="c:document">
<body>
    <xsl:apply-templates select="c:metadata"/>
    <xsl:apply-templates select="c:content"/>
</body>
</xsl:template>

<xsl:template match="c:metadata">
    <xsl:apply-templates select="md:abstract"/>
</xsl:template>

<xsl:template match="md:abstract">
    <xsl:apply-templates select="@*|node()"/>
</xsl:template>

但是,不幸的是,它没有捕获md:abstract元素。我想不通,想要是错的。

4

1 回答 1

2

在您的文档中有xmlns:md="http://cnx.rice.edu/mdml",而在 XSLT 中有xmlns:md="http://cnx.rice.edu/mdml/0.4". 这些不一样。命名空间必须在词法上相同才能匹配(没有别名或超类)。

我自己也经历过这个,试图管理版本化的命名空间,这是一场噩梦。要么像您的示例那样失败,要么您最终明确检查所有版本。如果它是您的命名空间,请删除该版本。

如果您正在设计它,您总是可以将版本放在一个单独的属性中(就像 XSLT 转换所做的那样)。

于 2013-08-06T12:47:50.240 回答