我对 XML 有点陌生,我有一个问题,我有一个生成的 XML 文档,其中某些元素的属性列表不完整。我正在尝试实现一个 XSLT 样式表,该样式表将它与一个主文档(它包含所有属性的默认值)交叉引用,以便用默认值填充任何缺失的属性。
例如,以下不完整的 XML 文档:
<?xml version="1.0" encoding="utf-8"?>
<foo>
<bar label="two" index="2"/>
</foo>
bar 元素缺少属性“type”,我想根据“label”的值从以下主文档中填充默认值:
<?xml version="1.0" encoding="utf-8"?>
<foo>
<bar label="one" index="1" type="type1"/>
<bar label="two" index="2" type="type2"/>
<bar label="three" index="3" type="type3"/>
</foo>
期望的结果是:
<?xml version="1.0" encoding="utf-8"?>
<foo>
<bar label="two" index="2" type="type2"/>
</foo>
我的 XSLT 样式表尝试使用 'document()' 和 XPath 的组合来执行此操作,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="master" select="document('master.xml')"/>
<!-- Template matching 'root' of XML document -->
<xsl:template match="/">
<xsl:apply-templates select="foo"/>
</xsl:template>
<!-- Template for generating 'foo' element -->
<xsl:template match="foo">
<foo>
<xsl:apply-templates select="bar"/>
</foo>
</xsl:template>
<!-- Template for generating 'bar' element -->
<xsl:template match="bar">
<bar label="{@label}" index="{@index}" type="{$master/foo/bar[@label=@label][1]/@type}"/>
</xsl:template>
</xsl:stylesheet>
但是,这不起作用,并为我提供了“bar”元素的默认“type”属性,其中“label”为“one”而不是“two”:
<?xml version="1.0" encoding="utf-8"?>
<foo>
<bar label="two" index="2" type="type1"/>
</foo>
一些调查显示 XPath 模式匹配所有的“条形”元素,而不仅仅是正确的元素,但我不知道为什么。
我做错了什么,有更好的方法吗?