xsl使用样式表

时间:2017-03-26 01:55:11

标签: xml xslt

我确信这很简单,但我无法做到我需要做的事情。会感激一些帮助。它应该发生的是在评论中,下面是我所做的。在stye表下面,我复制了3个xml文件作为调试示例。欣赏它,因为我无法弄明白。

我有多个xml文档。每个文件名都使用单词 dept 以及部门编号和.xml(即depta00.xml)进行格式化。我需要创建一个 horizo​​ns.xml 文件,其中包含来自所有xml文件的数据,这些文件列出了每个deaprtment中的所有员工。每个文档的格式都相同。具体来说,我需要在样式表中执行以下操作:

  1. 创建名为 getEmployees
  2. 的模板
  3. getPeople 模板中,创建一个名为depts的变量,其中包含表示deaprtment代码的以下文本字符串序列:'a00','c01','d11','d21','e11 '和'e21'
  4. 在创建 depts 变量的行之后,创建部门元素。
  5. departments 元素中,插入一个循环遍历 depts 序列中每个条目的for-each循环。
  6. 对于 depts 序列中的每个条目,请执行以下操作:

    一个。创建一个变量名 currentDept ,它等于depts序列中的当前项。

    湾使用名为 deptID 的属性创建一个元素部门,其值等于 currentDept 变量的值。

    ℃。使用doc()函数引用 deptcurrent.xml 文件,其中current是 currentDept 变量的值。使用concat()函数组合 dept currentDept 变量和文本字符串“.xml”的文本字符串。

    d。使用copy-of元素将employees元素及其后代的内容复制到department元素。

  7. 保存所有更改并使用XSLT 2.0处理器通过在alldepartments.xsl样式表中应用 getEmployees 模板来生成结果文档horizo​​ns.xml。
  8. XSLT

    <?xml version="1.0" encoding="UTF-8" ?>
    
    <xsl:stylesheet version="2.0"
         xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
         xmlns:xs="http://www.w3.org/2001/XMLSchema"
         exclude-result-prefixes="xs">
    
       <xsl:output method="xml" encoding="UTF-8" indent="yes" />
    
        <xsl:template name ="getEmployees">
            <xsl:variable name="depts" select="('a00','c01','d11','d21','e11', 'e21')" as="xs:string*" />
           <xsl:element name="departments">
                <xsl:for-each select="$depts"> <xsl:value-of select="." />
                    <xsl:variable name="currentDept"> <xsl:value-of select="$depts" /> </xsl:variable>
                    <xsl:element name="department">
                       <xsl:attribute name="deptID"> <xsl:value-of select="$currentDept" /> </xsl:attribute>
    
                       <xsl:value-of select="doc(concat('dept',$currentDept, '.xml'))" />
    
                       <xsl:copy-of select="employees" />
    
                  </xsl:element>
                </xsl:for-each>
            </xsl:element>
        </xsl:template>   
    </xsl:stylesheet>
    

    XML 文件

    <?xml version="1.0" encoding="UTF-8" ?>
    <!--
       Employee Information from Department A00
       Filename:         depta00.xml
    -->
    <?xml-stylesheet type="text/xsl" href="alldepartments.xsl"?>
    <employees>
       <employee empID="10">
           <firstName>Marylin</firstName>
           <middleInt>A</middleInt>
           <lastName>Johnson</lastName>
           <department>A00</department>
           <phone>3978</phone>
           <email>Johnson.60@example.com/horizons</email>
           <dateHired>2000-01-01</dateHired>
           <title>President</title>
           <edLevel>18</edLevel>
           <gender>F</gender>
           <birthDate>1968-08-24</birthDate>
           <salary>121300</salary>
           <bonus>2300</bonus>
           <commission>9700</commission>
       </employee>
       <employee empID="40">
           <firstName>Heather</firstName>
           <middleInt>D</middleInt>
           <lastName>Gordon</lastName>
           <department>A00</department>
           <phone>3915</phone>
           <email>Gordon.59@example.com/horizons</email>
           <dateHired>2009-03-01</dateHired>
           <title>Manager</title>
           <edLevel>18</edLevel>
           <gender>F</gender>
           <birthDate>1986-06-03</birthDate>
           <salary>85400</salary>
           <bonus>1700</bonus>
           <commission>6500</commission>
       </employee>
    </employees>
    
    <?xml version="1.0" encoding="UTF-8" ?>
    <!--
       Employee Information from Department E11
       Filename:         depte11.xml
    -->
    <?xml-stylesheet type="text/xsl" href="alldepartments.xsl"?>
    <employees>
       <employee empID="50">
           <firstName>Alicia</firstName>
           <middleInt>J</middleInt>
           <lastName>Silva</lastName>
           <department>E11</department>
           <phone>6789</phone>
           <email>Silva.50@example.com/horizons</email>
           <dateHired>2013-08-17</dateHired>
           <title>Manager</title>
           <edLevel>16</edLevel>
           <gender>M</gender>
           <birthDate>1960-09-15</birthDate>
           <salary>92400</salary>
           <bonus>1800</bonus>
           <commission>7400</commission>
       </employee>
       <employee empID="90">
           <firstName>Ila</firstName>
           <middleInt>R</middleInt>
           <lastName>Leclerc</lastName>
           <department>E11</department>
           <phone>5498</phone>
           <email>Leclerc.51@example.com/horizons</email>
           <dateHired>2005-08-15</dateHired>
           <title>Manager</title>
           <edLevel>16</edLevel>
           <gender>F</gender>
           <birthDate>1976-05-15</birthDate>
           <salary>68400</salary>
           <bonus>1400</bonus>
           <commission>5500</commission>
       </employee>
    </employees>
    
    <?xml version="1.0" encoding="UTF-8" ?>
    <!--
       Employee Information from Department D21
       Filename:         deptd21.xml
    -->
    <?xml-stylesheet type="text/xsl" href="alldepartments.xsl"?>
    <employees>
       <employee empID="70">
           <firstName>William</firstName>
           <middleInt>P</middleInt>
           <lastName>Kimble</lastName>
           <department>D21</department>
           <phone>7831</phone>
           <email>Kimble.87@example.com/horizons</email>
           <dateHired>2015-09-30</dateHired>
           <title>Manager</title>
           <edLevel>16</edLevel>
           <gender>F</gender>
           <birthDate>1988-05-26</birthDate>
           <salary>83200</salary>
           <bonus>1600</bonus>
           <commission>6700</commission>
       </employee>
       <employee empID="230">
           <firstName>Kevin</firstName>
           <middleInt>J</middleInt>
           <lastName>Smith</lastName>
           <department>D21</department>
           <phone>2094</phone>
           <email>Smith.77@example.com/horizons</email>
           <dateHired>2001-11-21</dateHired>
           <title>Clerk</title>
           <edLevel>14</edLevel>
           <gender>M</gender>
           <birthDate>1970-05-30</birthDate>
           <salary>51000</salary>
           <bonus>900</bonus>
           <commission>4100</commission>
       </employee>
       <employee empID="240">
           <firstName>Patrick</firstName>
           <middleInt>M</middleInt>
           <lastName>Trexler</lastName>
           <department>D21</department>
           <phone>3780</phone>
           <email>Trexler.63@example.com/horizons</email>
           <dateHired>2014-12-05</dateHired>
           <title>Clerk</title>
           <edLevel>17</edLevel>
           <gender>M</gender>
           <birthDate>1989-03-31</birthDate>
           <salary>66100</salary>
           <bonus>1400</bonus>
           <commission>5300</commission>
       </employee>
    </employees>
    

1 个答案:

答案 0 :(得分:0)

考虑使用外部exsl:node-set()保存您的部门代码树,然后使用xsl:for-each运行该树。请注意,下面只运行您发布的部门。扩展 $ deptList 以获取样式表当前目录中必须存在的其他可用deptXXX.xml。另请注意,您可以通过避免<xsl:element><xsl:attribute>来电来减少代码:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"                                                              
                              xmlns:ext="http://exslt.org/common"
                              exclude-result-prefixes="ext">
   <xsl:output method="xml" encoding="UTF-8" indent="yes" />
   <xsl:strip-space elements="*"/>

    <xsl:template match="/">
        <xsl:call-template name="getEmployees"/>
    </xsl:template>

    <xsl:template name="getEmployees">
      <xsl:variable name="deptList">
        <depts>
            <dept>a00</dept>
            <dept>d21</dept>
            <dept>e11</dept>            
        </depts>
      </xsl:variable>

      <xsl:variable name="depts" select="ext:node-set($deptList)/depts/*"/>

       <departments>            
            <xsl:for-each select="$depts">
                <xsl:variable name="currentDept"><xsl:value-of select="."/></xsl:variable>
                <department dept="{$currentDept}">
                    <xsl:if test="doc(concat('DeptEmployees',$currentDept, '.xml'))">
                        <xsl:copy-of select="doc(concat('dept',$currentDept, '.xml'))/employees" />
                    </xsl:if>
                </department>
            </xsl:for-each>
        </departments>
    </xsl:template>

</xsl:stylesheet>

<强>输出

<?xml version="1.0" encoding="UTF-8"?>
<departments>
   <department dept="a00">
      <employees>
         <employee empID="10">
            <firstName>Marylin</firstName>
            <middleInt>A</middleInt>
            <lastName>Johnson</lastName>
            <department>A00</department>
            <phone>3978</phone>
            <email>Johnson.60@example.com/horizons</email>
            <dateHired>2000-01-01</dateHired>
            <title>President</title>
            <edLevel>18</edLevel>
            <gender>F</gender>
            <birthDate>1968-08-24</birthDate>
            <salary>121300</salary>
            <bonus>2300</bonus>
            <commission>9700</commission>
         </employee>
         <employee empID="40">
            <firstName>Heather</firstName>
            <middleInt>D</middleInt>
            <lastName>Gordon</lastName>
            <department>A00</department>
            <phone>3915</phone>
            <email>Gordon.59@example.com/horizons</email>
            <dateHired>2009-03-01</dateHired>
            <title>Manager</title>
            <edLevel>18</edLevel>
            <gender>F</gender>
            <birthDate>1986-06-03</birthDate>
            <salary>85400</salary>
            <bonus>1700</bonus>
            <commission>6500</commission>
         </employee>
      </employees>
   </department>
   <department dept="d21">
      <employees>
         <employee empID="70">
            <firstName>William</firstName>
            <middleInt>P</middleInt>
            <lastName>Kimble</lastName>
            <department>D21</department>
            <phone>7831</phone>
            <email>Kimble.87@example.com/horizons</email>
            <dateHired>2015-09-30</dateHired>
            <title>Manager</title>
            <edLevel>16</edLevel>
            <gender>F</gender>
            <birthDate>1988-05-26</birthDate>
            <salary>83200</salary>
            <bonus>1600</bonus>
            <commission>6700</commission>
         </employee>
         <employee empID="230">
            <firstName>Kevin</firstName>
            <middleInt>J</middleInt>
            <lastName>Smith</lastName>
            <department>D21</department>
            <phone>2094</phone>
            <email>Smith.77@example.com/horizons</email>
            <dateHired>2001-11-21</dateHired>
            <title>Clerk</title>
            <edLevel>14</edLevel>
            <gender>M</gender>
            <birthDate>1970-05-30</birthDate>
            <salary>51000</salary>
            <bonus>900</bonus>
            <commission>4100</commission>
         </employee>
         <employee empID="240">
            <firstName>Patrick</firstName>
            <middleInt>M</middleInt>
            <lastName>Trexler</lastName>
            <department>D21</department>
            <phone>3780</phone>
            <email>Trexler.63@example.com/horizons</email>
            <dateHired>2014-12-05</dateHired>
            <title>Clerk</title>
            <edLevel>17</edLevel>
            <gender>M</gender>
            <birthDate>1989-03-31</birthDate>
            <salary>66100</salary>
            <bonus>1400</bonus>
            <commission>5300</commission>
         </employee>
      </employees>
   </department>
   <department dept="e11">
      <employees>
         <employee empID="50">
            <firstName>Alicia</firstName>
            <middleInt>J</middleInt>
            <lastName>Silva</lastName>
            <department>E11</department>
            <phone>6789</phone>
            <email>Silva.50@example.com/horizons</email>
            <dateHired>2013-08-17</dateHired>
            <title>Manager</title>
            <edLevel>16</edLevel>
            <gender>M</gender>
            <birthDate>1960-09-15</birthDate>
            <salary>92400</salary>
            <bonus>1800</bonus>
            <commission>7400</commission>
         </employee>
         <employee empID="90">
            <firstName>Ila</firstName>
            <middleInt>R</middleInt>
            <lastName>Leclerc</lastName>
            <department>E11</department>
            <phone>5498</phone>
            <email>Leclerc.51@example.com/horizons</email>
            <dateHired>2005-08-15</dateHired>
            <title>Manager</title>
            <edLevel>16</edLevel>
            <gender>F</gender>
            <birthDate>1976-05-15</birthDate>
            <salary>68400</salary>
            <bonus>1400</bonus>
            <commission>5500</commission>
         </employee>
      </employees>
   </department>
</departments>
相关问题