我有一个项目似乎已经超出了我的舒适区,并且需要一些(高级?)XSL 处理。
我有以下两个示例 XML 文档:
Doc1
<instance>
<InfBy1>Dr Phibes</InfBy1>
<InfBy2>Dr X</InfBy2>
<InfBy3>Dr Chivago</InfBy3>
</instance>
Doc2
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>
我必须从 Doc2 中获取 XModID 值并将其与 Doc1 中的关联名称(值)进行匹配。然而,一个额外的复杂性是,这会创建记录以加载到数据库中,因此在我的场景中,Phibes 博士在<InfBy1>
但在另一张唱片中他可能会说<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>
<InfBy3>
<items>
<item>
<label>Dr Chivago</label>
<value>62</value>
</item>
</items>
</InfBy3>
任何想法真的很感激......
Thanks,
Will
这个转变:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:my="my:my">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:key name="kPhysByName" match="KB_XMod_Modules"
use="Physician"/>
<my:doc2>
<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>
</my:doc2>
<xsl:template match="/">
<result>
<xsl:apply-templates/>
</result>
</xsl:template>
<xsl:template match="/*/*[starts-with(name(), 'InfBy')]">
<xsl:variable name="vCur" select="."/>
<xsl:for-each select="document('')">
<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 文档时(它包含第二个嵌入的——只是为了方便):
<instance>
<InfBy1>Dr Phibes</InfBy1>
<InfBy2>Dr X</InfBy2>
<InfBy3>Dr Chivago</InfBy3>
</instance>
产生想要的正确结果:
<result xmlns:my="my:my">
<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>
</result>
解释:
这种转变非常简单。为了方便起见,我们使用键,出于同样的原因,我们将第二个文档嵌入到 XSLT 样式表中。在实际应用中,第二个文档将是独立的,唯一需要的更改(除了从样式表中删除它)将是替换:
<xsl:for-each select="document('')">
with:
<xsl:for-each select="document('someURL')">
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)