添加命名空间后无法获取所需的输出xml

时间:2013-05-06 17:59:00

标签: xml xslt

如果我将命名空间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中:

Updating info in one XML file with optional info from another, using XSLT

看起来xslt无法输出预期的结果; 没有这个xmlns =“http://www.yahoo.com/xmlns/ApplicationTest”

,它工作得很完美

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

感谢

2 个答案:

答案 0 :(得分:2)

如果需要引用名称属于命名空间的XML数据中的任何元素,则必须在样式表中为该命名空间分配前缀。在样式表中,即使存在默认的xmlns="http://..."定义,XSLT也会在XPath表达式或匹配模式中考虑具有无前缀名称的每个元素,以使无命名空间

所以你必须写一些像

这样的东西
xmlns:app="http://www.yahoo.com/xmlns/ApplicationTest"

然后使用新的命名空间为目标XML数据中的节点添加所有引用前缀,例如app:root

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

答案 1 :(得分:1)

要使上一个answer的样式表工作,请将名称空间声明添加到样式表(带前缀),并为所有节点名称使用新的名称空间前缀。

因此应该这样做:

<?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">