如果我将命名空间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来修复它?
感谢
答案 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">