我将来自两个源xml文档的名称与以下xsl匹配(感谢本网站上其他人的大量帮助)。所以这个:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:key name="kPhysByName" match="KB_XMod_Modules" use="Physician"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*/*/*[starts-with(name(), 'InfBy')]">
<xsl:variable name="vCur" select="."/>
<xsl:for-each select="document('profiles.xml')">
<xsl:variable name="vMod" select="key('kPhysByName', $vCur)"/>
<xsl:copy>
<items>
<item>
<label><xsl:value-of select="$vMod/Physician"/></label>
<value><xsl:value-of select="$vMod/XModID"/></value>
</item>
</items>
</xsl:copy>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
...匹配这些:
<?xml version="1.0" encoding="utf-8"?>
<instance>
<record>
<InfBy1>Dr Phibes</InfBy1>
<InfBy2>Dr X</InfBy2>
<InfBy3>Dr Chivago</InfBy3>
</record>
<record>
<InfBy1>Dr Phibes</InfBy1>
<InfBy2>Dr X</InfBy2>
<InfBy3>Dr Chivago</InfBy3>
</record>
</instance>
<?xml version="1.0" encoding="utf-8"?>
<root>
<KB_XMod_Modules>
<Physician>Dr Phibes</Physician>
<XModID>60</XModID>
</KB_XMod_Modules>
<KB_XMod_Modules>
<Physician>Dr X</Physician>
<XModID>61</XModID>
</KB_XMod_Modules>
<KB_XMod_Modules>
<Physician>Dr Chivago</Physician>
<XModID>62</XModID>
</KB_XMod_Modules>
</root>
......产生这个:
<instance>
<record>
<items>
<item>
<label>Dr Phibes</label>
<value>60</value>
</item>
</items>
<items>
<item>
<label>Dr X</label>
<value>61</value>
</item>
</items>
<items>
<item>
<label>Dr Chivago</label>
<value>62</value>
</item>
</items>
</record>
<record>
<items>
<item>
<label>Dr Phibes</label>
<value>60</value>
</item>
</items>
<items>
<item>
<label>Dr X</label>
<value>61</value>
</item>
</items>
<items>
<item>
<label>Dr Chivago</label>
<value>62</value>
</item>
</items>
</record>
</instance>
但是,在此示例中,缺少父<InfBy1>
,<InfBy2>
和<InfBy3>
标记。我正在努力找到一种方法来复制这些元素,同时保持正确的名称,以便我有:
<InfBy1>
<items>
<item>
<label>Dr Phibes</label>
<value>60</value>
</item>
</items>
</InfBy1>
<InfBy2>
<items>
<item>
<label>Dr X</label>
<value>61</value>
</item>
</items>
</InfBy2>
...etc
感谢您的期待...
答案 0 :(得分:0)
首先,xsl:copy
指令在该上下文中无用(带有'profiles.xml'
URI的文档的根节点)。
这导致了实际答案:使用xsl:copy
指令,其中上下文是匹配元素。
<xsl:template match="/*/*/*[starts-with(name(), 'InfBy')]">
<xsl:variable name="vCur" select="."/>
<xsl:copy>
<xsl:for-each select="document('profiles.xml')">
<xsl:variable name="vMod" select="key('kPhysByName', $vCur)"/>
<items>
<item>
<label>
<xsl:value-of select="$vMod/Physician"/>
</label>
<value>
<xsl:value-of select="$vMod/XModID"/>
</value>
</item>
</items>
</xsl:for-each>
</xsl:copy>
</xsl:template>