使用XSLT按ID组合两个XML文件的值

时间:2016-05-18 19:24:32

标签: html xml xslt

我有两个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>

1 个答案:

答案 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}}