0

如果我添加命名空间 xmlns="http://www.yahoo.com/xmlns/ApplicationTest" 作为

<?xml version="1.0" xmlns="http://www.yahoo.com/xmlns/ApplicationTest" encoding="UTF-8"?>

在我的帖子中的 usa11.xml 和 usa22.xml 中:

使用 XSLT 使用另一个 XML 文件中的可选信息更新一个 XML 文件中的信息

看起来 xslt 无法输出预期结果;没有这个 xmlns="http://www.yahoo.com/xmlns/ApplicationTest" 它工作得很好

请帮助如何使用 XSL 来修复它?

谢谢'

4

2 回答 2

2

如果您需要引用 XML 数据中名称属于某个名称空间的任何元素,您必须在样式表中为该名称空间分配一个前缀。在样式表中,XSLT 认为 XPath 表达式或匹配模式中名称不带前缀的每个元素都没有命名空间,即使有默认xmlns="http://..."定义也是如此。

所以你必须写一些像

xmlns:app="http://www.yahoo.com/xmlns/ApplicationTest"

然后在目标 XML 数据中为所有对节点的引用加上新的命名空间,例如app:root.

如果没有看到您的实时数据,我无法举出更好的例子。我希望这很清楚。

于 2013-05-06T18:34:04.337 回答
1

要使上一个答案中的样式表起作用,请将命名空间声明添加到样式表(带有前缀),并对所有节点名称使用新的命名空间前缀。

因此这应该这样做:

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:y="http://www.yahoo.com/xmlns/ApplicationTest"
                >

    <xsl:variable name="u2" select="document('usaa22.xml')"/>
    <xsl:template match="y:city">
        <xsl:choose>
            <xsl:when test="$u2//y:city[y:street=current()/y:street]">
                <xsl:copy>
                    <xsl:apply-templates select="$u2//y:city[y:street=current()/y:street]/* " />
                </xsl:copy>
            </xsl:when>
            <xsl:otherwise>
                <xsl:copy>
                    <xsl:apply-templates select="@* | node() " />
                </xsl:copy>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

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

注意:您的 xml 更改似乎不正确:

<?xml version="1.0" xmlns="http://www.yahoo.com/xmlns/ApplicationTest" encoding="UTF-8"?>

<?xml序言不允许命名空间。
命名空间应添加到 xml 文件中的第一个元素:

<country xmlns="http://www.yahoo.com/xmlns/ApplicationTest">
于 2013-05-06T18:57:43.997 回答