XML链接多个模板中的元素

时间:2013-11-06 07:53:12

标签: xml xslt

我是第一次使用xsl。需要xsl的xml是按部门构建的。 现在我想要实现的是,可以为xml中的每个person元素设置一次提到的Deparment元素。我现在已经看了两天了,我无法弄清楚如何解决这个问题。

这是XML:

    <?xml version="1.0" standalone="yes"?>
       <ApptoAppExport>                

          <DepartmentData>
             <DepartmentName>105</DepartmentName>
          </DepartmentData>

          <Person>
             <EmployeeNumber>0010</EmployeeNumber>
          </Person>

          <Person>
            <EmployeeNumber>0011</EmployeeNumber>
          </Person>

       </ApptoAppExport>

这是我的XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:scripts="urn:scripts.this" version="1.0">
   <xsl:output method="xml" encoding="utf-8" />
   <xsl:template match="/">
      <xsl:element name="AppPersonList">
         <xsl:apply-templates />
      </xsl:element>
   </xsl:template>
   <xsl:template match="DepartmentData|Person">
      <xsl:element name="AppPerson">
         <xsl:call-template name="PersGuid" />
         <xsl:call-template name="PersEmployeeNum" />
         <xsl:call-template name="PersDepaGuid" />
      </xsl:element>
   </xsl:template>
   <xsl:template name="PersGuid">
      <xsl:variable name="EmpNum" select="./EmployeeNumber" />
      <xsl:attribute name="PersGuid">
         <xsl:value-of select="/Document/Persons/Row[scripts:MatchInsensitive(@PersEmployeeNum, $EmpNum)]/@PersGuid" />
      </xsl:attribute>
   </xsl:template>
   <xsl:template name="PersDepaGuid">
      <xsl:variable name="Depa" select="./DepartmentName" />
      <xsl:attribute name="PersDepaGuid">
         <xsl:choose>
            <xsl:when test="/Document/Departments/Row[scripts:MatchInsensitive(@DepaName, $Depa)]">
               <xsl:value-of select="/Document/Departments/Row[scripts:MatchInsensitive(@DepaName, $Depa)]/@DepaGuid" />
            </xsl:when>
            <xsl:otherwise>
               <xsl:value-of select="scripts:MakeError($Depa)" />
            </xsl:otherwise>
         </xsl:choose>
      </xsl:attribute>
   </xsl:template>
</xsl:stylesheet>

“Department / Row”元素指的是我们的SQL数据库表结构。使用该元素,我可以告诉xsl在指定的表中查找与DepaName同名的行,然后给我属于它的Guid。这样就可以填入输出文件进行处理。

现在我想要的是这个输出文件,来自results.xml:

<?xml version="1.0" encoding="utf-8"?>
<AppPersonList>  
<AppPerson PersGuid="ff3ecf77-f6d5-4260-a1d3-88ae13fcc931" PersDepaGuid="93e4fcba-306e-4071-ab63-248d78fed6c9" />
</AppPersonList>

但这就是我得到的:

<?xml version="1.0" encoding="utf-8"?>
<AppPersonList>  
<AppPerson PersGuid="63f09537-5681-45b4-95a1-008808b8caac" PersDepaGuid="7ff981dc-7b56-403b-8c02-77f741a72e53" />
</AppPersonList>
<AppPersonList>  
<AppPerson PersGuid="93e4fcba-306e-4071-ab63-248d78fed6c9" PersDepaGuid="IMPORTERROR:" />
</AppPersonList>
<AppPersonList>  
<AppPerson PersGuid="ff3ecf77-f6d5-4260-a1d3-88ae13fcc931" PersDepaGuid="IMPORTERROR:" />
</AppPersonList>

所以它似乎工作一次,但检查“PersGuid”的第一个元素是不正确的,所以我不太确定他从哪里得到它。之后,其他元素未填充并获取“ImportError:”消息。

app,xml和xsl由命令行触发,该命令行引用应上传数据的表。

我应该怎么做?

提前感谢您的反应。

0 个答案:

没有答案