我有两个XML文件,我想使用单个XSL文件转换为HTML。在elements.xml
我有一个部分,它通过ID组合来自这些XML文件的值。现在,在我的HTML文件中,我想将每个<element>
作为单独的<div>
展示,其中我要列出<linkedId>
中链接的效果的名称。我假设会有一些广泛使用的变量,但我无法理解它。
例如,第一个元素的输出应如下所示:
<div>
<div><p>NAME2</p></div>
<div><p>NAME1</p></div>
</div>
Elements.xml的
<elements>
<listOfElements>
<element>
<id>ID-element-1</id>
*some data*
</element>
<element>
<id>ID-element-2</id>
*some data*
</element>
(...)
</listOfElements>
<linkedIds>
<linkedId>
<idOfElement>ID-element-1</idOfElement>
<idOfEffect>ID-effect-2</idOfEffect>
<idOfEffect>ID-effect-1</idOfEffect>
<linkedId>
<linkedId>
<idOfElement>ID-element-2</idOfElement>
<idOfEffect>ID-effect-2</idOfEffect>
<idOfEffect>ID-effect-4</idOfEffect>
<idOfEffect>ID-effect-7</idOfEffect>
<linkedId>
(...)
</linkedIds>
</elements>
effects.xml
<effects>
<effect>
<idEffect>ID-effect-1</idEffect>
<name>NAME1</name>
</effect>
<effect>
<idEffect>ID-effect-2</idEffect>
<name>NAME2</name>
</effect>
<effect>
<idEffect>ID-effect-4</idEffect>
<name>NAME4</name>
</effect>
<effect>
<idEffect>ID-effect-7</idEffect>
<name>NAME7</name>
</effect>
</effect>
transform.xsl
<xsl:template match="elements">
<div>
<xsl:for-each select="elements/element">
<xsl:variable name="ElementID" select='linkedIds/linkedId/idOfElement'/>
<xsl:apply-templates select="document('effects.xml')/effects"/>
???
</xsl:for-each>
</div>
</xsl:template>
<xsl:template match="effects">
<xsl:for-each select="effects/effect">
<div>
<p><xsl:value-of select="name"/></p>
</div>
</xsl:for-each>
</xsl:template>
答案 0 :(得分:1)
定义两个键
element
然后在匹配<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:param name="effects-url" select="'test2016051804.xml'"/>
<xsl:variable name="effects-doc" select="document($effects-url)"/>
<xsl:output method="html" indent="yes"/>
<xsl:key name="k1" match="linkedIds/linkedId" use="idOfElement"/>
<xsl:key name="k2" match="effect" use="idEffect"/>
<xsl:template match="/">
<html lang="en">
<body>
<xsl:apply-templates select="//element"/>
</body>
</html>
</xsl:template>
<xsl:template match="elements/listOfElements/element">
<div>
<xsl:variable name="linkedIds" select="key('k1', id)"/>
<xsl:for-each select="$effects-doc">
<xsl:apply-templates select="key('k2', $linkedIds/idOfEffect)/name"/>
</xsl:for-each>
<!-- with XSLT 2.0 you can simply use
<xsl:apply-templates select="key('k2', key('k1', id), $effects-doc)"/>
for the above 4 lines
-->
</div>
</xsl:template>
<xsl:template match="effect/name">
<div>
<p>
<xsl:value-of select="."/>
</p>
</div>
</xsl:template>
</xsl:stylesheet>
的模板中使用它们
<elements>
<listOfElements>
<element>
<id>ID-element-1</id> *some data* </element>
<element>
<id>ID-element-2</id> *some data* </element>
</listOfElements>
<linkedIds>
<linkedId>
<idOfElement>ID-element-1</idOfElement>
<idOfEffect>ID-effect-2</idOfEffect>
<idOfEffect>ID-effect-1</idOfEffect>
</linkedId>
<linkedId>
<idOfElement>ID-element-2</idOfElement>
<idOfEffect>ID-effect-2</idOfEffect>
<idOfEffect>ID-effect-4</idOfEffect>
<idOfEffect>ID-effect-7</idOfEffect>
</linkedId>
</linkedIds>
</elements>
那样输入
effects-url
和(您可以根据需要在样式表中设置参数<effects>
<effect>
<idEffect>ID-effect-1</idEffect>
<name>NAME1</name>
</effect>
<effect>
<idEffect>ID-effect-2</idEffect>
<name>NAME2</name>
</effect>
<effect>
<idEffect>ID-effect-4</idEffect>
<name>NAME4</name>
</effect>
<effect>
<idEffect>ID-effect-7</idEffect>
<name>NAME7</name>
</effect>
</effects>
)
<html lang="en">
<body>
<div>
<div>
<p>NAME1</p>
</div>
<div>
<p>NAME2</p>
</div>
</div>
<div>
<div>
<p>NAME2</p>
</div>
<div>
<p>NAME4</p>
</div>
<div>
<p>NAME7</p>
</div>
</div>
</body>
</html>
转化为
{{1}}