有没有一种方法可以合并多个XSLT’;在单个输出文件中获取输出的步骤?

有没有一种方法可以合并多个XSLT’;在单个输出文件中获取输出的步骤?,xslt,xslt-1.0,xslt-2.0,Xslt,Xslt 1.0,Xslt 2.0,我目前有一个开发,它从一个XML输入生成三个不同的员工状态文件。下面是示例XML <wd:Report_Data xmlns:wd="urn:com.workday.report/Demo_Report"> <wd:Report_Entry> <wd:Flag>HIRE</wd:Flag> <wd:Userid>12345</wd:Userid> <wd:FirstName>Jack

我目前有一个开发,它从一个XML输入生成三个不同的员工状态文件。下面是示例XML

 <wd:Report_Data xmlns:wd="urn:com.workday.report/Demo_Report">
 <wd:Report_Entry>
 <wd:Flag>HIRE</wd:Flag>
 <wd:Userid>12345</wd:Userid>
 <wd:FirstName>Jack</wd:FirstName>
 <wd:LastName>Jones</wd:LastName>
 <wd:BusinessTitle>Engineer</wd:businessTitle>
 <wd:Country>US</wd:Country>
 </wd:Report_Entry>
 <wd:Report_Entry>
 <wd:Flag>UPDATE</wd:Flag>
 <wd:Userid>890767</wd:Userid>
 <wd:FirstName>Mike</wd:FirstName>
 <wd:LastName>Balder</wd:LastName>
 <wd:BusinessTitle>Jr.Engineer</wd:businessTitle>
 <wd:Country>US</wd:Country>
 </wd:Report_Entry>
 <wd:Report_Entry>
 <wd:Flag>TERMINATE</wd:Flag>
 <wd:Userid>543908</wd:Userid>
 <wd:FirstName>Bolton</wd:FirstName>
 <wd:LastName>James</wd:LastName>
 <wd:BusinessTitle>Sr.Engineer</wd:businessTitle>
 <wd:Country>US</wd:Country>
 </wd:Report_Entry>
 </wd:Report_Data>

租用
12345
杰克
琼斯
工程师
美国
更新
890767
迈克
犹豫不决
小工程师
美国
终止
543908
博尔顿
詹姆斯
高级工程师
美国
我有以下三个XSLT,它们生成三个员工状态不同的文件,如下所示

XSLT 1

     <?xml version="1.0" encoding="UTF-8"?>
     <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" 
     xmlns:xtt="urn:com.workday/xtt" xmlns:wd="urn:com.workday.report/Demo_Report" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0">
     <xsl:output method="text"/>
     <xsl:variable name="linefeed" select="'&#xA;'"/>
     <xsl:template match="wd:Report_Data">
     <File>
      <xsl:text>user,add,abc@y.com,admin,ghy567</xsl:text>
      <xsl:value-of select="$linefeed"/>
      <xsl:text>"User id","FirstName","LastName","BusinessTitle","Country"</xsl:text>
      <xsl:value-of select="$linefeed"/>
      <!--  for each Employee section -->
      <xsl:for-each select="/wd:Report_Data/wd:Report_Entry">
      <xsl:if test="wd:Flag ='HIRE' and wd:Position Type !=''">
      <xsl:text>"</xsl:text>
      <xsl:value-of select="wd:Userid"/>
      <xsl:text>","</xsl:text>
      <xsl:value-of select="wd:FirstName"/>
      <xsl:text>","</xsl:text>
      <xsl:value-of select="wd:LastName"/>
      <xsl:text>","</xsl:text>
      <xsl:value-of select="wd:BusinessTitle"/>
      <xsl:text>","</xsl:text>
      <xsl:value-of select="wd:Country"/>
      </xsl:if>
      </xsl:for-each>
      </File>
      </xsl:template>
      </xsl:stylesheet>

用户,添加,abc@y.com,行政主任,ghy567
“用户id”、“名字”、“姓氏”、“业务名称”、“国家”
"
","
","
","
","
XSLT2

     <?xml version="1.0" encoding="UTF-8"?>
     <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" 
     xmlns:xtt="urn:com.workday/xtt" xmlns:wd="urn:com.workday.report/Demo_Report" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0">
     <xsl:output method="text"/>
     <xsl:variable name="linefeed" select="'&#xA;'"/>
     <xsl:template match="wd:Report_Data">
     <File>
      <xsl:text>user,update,abc@y.com,admin,ghy567</xsl:text>
      <xsl:value-of select="$linefeed"/>
      <xsl:text>"User id","FirstName","LastName","BusinessTitle","Country"</xsl:text>
      <xsl:value-of select="$linefeed"/>
      <!--  for each Employee section -->
      <xsl:for-each select="/wd:Report_Data/wd:Report_Entry">
      <xsl:if test="wd:Flag ='UPDATE' and wd:Position Type !=''">
      <xsl:text>"</xsl:text>
      <xsl:value-of select="wd:Userid"/>
      <xsl:text>","</xsl:text>
      <xsl:value-of select="wd:FirstName"/>
      <xsl:text>","</xsl:text>
      <xsl:value-of select="wd:LastName"/>
      <xsl:text>","</xsl:text>
      <xsl:value-of select="wd:BusinessTitle"/>
      <xsl:text>","</xsl:text>
      <xsl:value-of select="wd:Country"/>
      </xsl:if>
      </xsl:for-each>
      </File>
      </xsl:template>
      </xsl:stylesheet>

用户,更新,abc@y.com,行政主任,ghy567
“用户id”、“名字”、“姓氏”、“业务名称”、“国家”
"
","
","
","
","
XSLT 3

     <?xml version="1.0" encoding="UTF-8"?>
     <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" 
     xmlns:xtt="urn:com.workday/xtt" xmlns:wd="urn:com.workday.report/Demo_Report" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0">
     <xsl:output method="text"/>
     <xsl:variable name="linefeed" select="'&#xA;'"/>
     <xsl:template match="wd:Report_Data">
     <File>
      <xsl:text>user,terminate,abc@y.com,admin,ghy567</xsl:text>
      <xsl:value-of select="$linefeed"/>
      <xsl:text>"User id","FirstName","LastName","BusinessTitle","Country"</xsl:text>
      <xsl:value-of select="$linefeed"/>
      <!--  for each Employee section -->
      <xsl:for-each select="/wd:Report_Data/wd:Report_Entry">
      <xsl:if test="wd:Flag ='TERMINATE' and wd:Position Type !=''">
      <xsl:text>"</xsl:text>
      <xsl:value-of select="wd:Userid"/>
      <xsl:text>","</xsl:text>
      <xsl:value-of select="wd:FirstName"/>
      <xsl:text>","</xsl:text>
      <xsl:value-of select="wd:LastName"/>
      <xsl:text>","</xsl:text>
      <xsl:value-of select="wd:BusinessTitle"/>
      <xsl:text>","</xsl:text>
      <xsl:value-of select="wd:Country"/>
      </xsl:if>
      </xsl:for-each>
      </File>
      </xsl:template>
      </xsl:stylesheet>

用户,终止,abc@y.com,行政主任,ghy567
“用户id”、“名字”、“姓氏”、“业务名称”、“国家”
"
","
","
","
","
输出文件1

     <?xml version="1.0" encoding="UTF-8"?>
     <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" 
     xmlns:xtt="urn:com.workday/xtt" xmlns:wd="urn:com.workday.report/Demo_Report" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0">
     <xsl:output method="text"/>
     <xsl:variable name="linefeed" select="'&#xA;'"/>
     <xsl:template match="wd:Report_Data">
     <File>
      <xsl:text>user,add,abc@y.com,admin,ghy567</xsl:text>
      <xsl:value-of select="$linefeed"/>
      <xsl:text>"User id","FirstName","LastName","BusinessTitle","Country"</xsl:text>
      <xsl:value-of select="$linefeed"/>
      <!--  for each Employee section -->
      <xsl:for-each select="/wd:Report_Data/wd:Report_Entry">
      <xsl:if test="wd:Flag ='HIRE' and wd:Position Type !=''">
      <xsl:text>"</xsl:text>
      <xsl:value-of select="wd:Userid"/>
      <xsl:text>","</xsl:text>
      <xsl:value-of select="wd:FirstName"/>
      <xsl:text>","</xsl:text>
      <xsl:value-of select="wd:LastName"/>
      <xsl:text>","</xsl:text>
      <xsl:value-of select="wd:BusinessTitle"/>
      <xsl:text>","</xsl:text>
      <xsl:value-of select="wd:Country"/>
      </xsl:if>
      </xsl:for-each>
      </File>
      </xsl:template>
      </xsl:stylesheet>
用户,添加,abc@y.com,管理员,ghy567
用户id、姓氏、姓氏、企业名称、国家/地区
12345,杰克,琼斯,工程师,美国

输出文件2

     <?xml version="1.0" encoding="UTF-8"?>
     <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" 
     xmlns:xtt="urn:com.workday/xtt" xmlns:wd="urn:com.workday.report/Demo_Report" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0">
     <xsl:output method="text"/>
     <xsl:variable name="linefeed" select="'&#xA;'"/>
     <xsl:template match="wd:Report_Data">
     <File>
      <xsl:text>user,update,abc@y.com,admin,ghy567</xsl:text>
      <xsl:value-of select="$linefeed"/>
      <xsl:text>"User id","FirstName","LastName","BusinessTitle","Country"</xsl:text>
      <xsl:value-of select="$linefeed"/>
      <!--  for each Employee section -->
      <xsl:for-each select="/wd:Report_Data/wd:Report_Entry">
      <xsl:if test="wd:Flag ='UPDATE' and wd:Position Type !=''">
      <xsl:text>"</xsl:text>
      <xsl:value-of select="wd:Userid"/>
      <xsl:text>","</xsl:text>
      <xsl:value-of select="wd:FirstName"/>
      <xsl:text>","</xsl:text>
      <xsl:value-of select="wd:LastName"/>
      <xsl:text>","</xsl:text>
      <xsl:value-of select="wd:BusinessTitle"/>
      <xsl:text>","</xsl:text>
      <xsl:value-of select="wd:Country"/>
      </xsl:if>
      </xsl:for-each>
      </File>
      </xsl:template>
      </xsl:stylesheet>
用户,更新,abc@y.com,管理员,ghy567
用户id、姓氏、姓氏、企业名称、国家/地区
890767,迈克,巴尔德,小工程师,美国

输出文件3

     <?xml version="1.0" encoding="UTF-8"?>
     <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" 
     xmlns:xtt="urn:com.workday/xtt" xmlns:wd="urn:com.workday.report/Demo_Report" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0">
     <xsl:output method="text"/>
     <xsl:variable name="linefeed" select="'&#xA;'"/>
     <xsl:template match="wd:Report_Data">
     <File>
      <xsl:text>user,terminate,abc@y.com,admin,ghy567</xsl:text>
      <xsl:value-of select="$linefeed"/>
      <xsl:text>"User id","FirstName","LastName","BusinessTitle","Country"</xsl:text>
      <xsl:value-of select="$linefeed"/>
      <!--  for each Employee section -->
      <xsl:for-each select="/wd:Report_Data/wd:Report_Entry">
      <xsl:if test="wd:Flag ='TERMINATE' and wd:Position Type !=''">
      <xsl:text>"</xsl:text>
      <xsl:value-of select="wd:Userid"/>
      <xsl:text>","</xsl:text>
      <xsl:value-of select="wd:FirstName"/>
      <xsl:text>","</xsl:text>
      <xsl:value-of select="wd:LastName"/>
      <xsl:text>","</xsl:text>
      <xsl:value-of select="wd:BusinessTitle"/>
      <xsl:text>","</xsl:text>
      <xsl:value-of select="wd:Country"/>
      </xsl:if>
      </xsl:for-each>
      </File>
      </xsl:template>
      </xsl:stylesheet>
用户,终止,abc@y.com,管理员,ghy567
用户id、姓氏、姓氏、企业名称、国家/地区
543908,博尔顿,詹姆斯,高级工程师,美国

现在,我有另一个要求,即第四个文件必须在一个文件中生成所有三个文件的合并数据,如下所示

用户,添加,abc@y.com,管理员,ghy567
用户id、姓氏、姓氏、企业名称、国家/地区
12345,杰克,琼斯,工程师,美国

用户,更新,abc@y.com,管理员,ghy567
用户id、姓氏、姓氏、企业名称、国家/地区
890767,迈克,巴尔德,小工程师,美国

用户,终止,abc@y.com,管理员,ghy567
用户id、姓氏、姓氏、企业名称、国家/地区
543908,博尔顿,詹姆斯,高级工程师,美国

那么,有没有一种方法可以合并三个XSLT以在单个文件中获得输出?

如何:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:wd="urn:com.workday.report/Demo_Report">
<xsl:output method="text"/>

<xsl:variable name="header2" select="'User id,FirstName,LastName,BusinessTitle,Country&#xA;'"/>

<xsl:template match="/wd:Report_Data">
    <!--  ADD -->
    <xsl:text>user,add,abc@y.com,admin,ghy567&#xA;</xsl:text>
    <xsl:value-of select="$header2"/>
    <xsl:apply-templates select="wd:Report_Entry[wd:Flag='HIRE']"/>
    <xsl:text>&#xA;</xsl:text>
    <!--  UPDATE -->
    <xsl:text>user,update,abc@y.com,admin,ghy567&#xA;</xsl:text>
    <xsl:value-of select="$header2"/>
    <xsl:apply-templates select="wd:Report_Entry[wd:Flag='UPDATE']"/>
    <xsl:text>&#xA;</xsl:text>
    <!--  TERMINATE -->
    <xsl:text>user,terminate,abc@y.com,admin,ghy567&#xA;</xsl:text>
    <xsl:value-of select="$header2"/>
    <xsl:apply-templates select="wd:Report_Entry[wd:Flag='TERMINATE']"/>
</xsl:template>
    
<xsl:template match="wd:Report_Entry">
    <xsl:text>"</xsl:text>
    <xsl:value-of select="wd:Userid"/>
    <xsl:text>","</xsl:text>
    <xsl:value-of select="wd:FirstName"/>
    <xsl:text>","</xsl:text>
    <xsl:value-of select="wd:LastName"/>
    <xsl:text>","</xsl:text>
    <xsl:value-of select="wd:BusinessTitle"/>
    <xsl:text>","</xsl:text>
    <xsl:value-of select="wd:Country"/>
    <xsl:text>"&#xA;</xsl:text>
</xsl:template>

</xsl:stylesheet>

用户,添加,abc@y.com,行政,ghy567和#xA;

;
用户,更新,abc@y.com,行政,ghy567和#xA;

;
用户,终止,abc@y.com,行政,ghy567和#xA;
"
","
","
","
","
“
;

使用XSLT 3或XQuery 3.1,您可以使用
fn:transform
从XPath运行XSLT,因此在XQuery 3.1中,您可以使用

declare namespace output = "http://www.w3.org/2010/xslt-xquery-serialization";

declare option output:method 'text';
declare option output:item-separator '&#10;&#10;';

declare variable $sheet-uris as xs:string* external := ('sheet1.xsl', 'sheet2.xsl', 'sheet3.xsl');

declare variable $sheets as document-node()* external :=  $sheet-uris ! doc(.);

let $xml := .
return
  $sheets 
  ! 
  transform(
    map {
        'stylesheet-node' : .,
        'source-node' : $xml,
        'delivery-format' : 'serialized'
    }
  )?output
或者在XSLT3中

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="3.0"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  exclude-result-prefixes="#all"
  expand-text="yes">

  <xsl:param name="sheet-uris" as="xs:string*" select="'sheet1.xsl', 'sheet2.xsl', 'sheet3.xsl'"/>

  <xsl:param name="$sheets" as="document-node()*" select="$sheet-uris ! doc(.)"/>

  <xsl:output method="text" item-separator="&#10;&#10;"/>

  <xsl:template match="/">
    <xsl:sequence
     select="
      $sheets 
      ! 
      transform(
        map {
            'stylesheet-node' : .,
            'source-node' : current(),
            'delivery-format' : 'serialized'
        }
      )?output"/>
  </xsl:template>
  
</xsl:stylesheet>

以下是您如何在中实现此功能(目前由测试版支持,记录在):



它使用内置的
p:for XProc的每个
p:xslt
步骤和
p:xslt
步骤,根据
sheet uris
选项提供的样式表序列运行输入源。

好吧,xslt 3有
fn:transform
,因此它将允许这样做,就像XQuery 3.1一样。XProc当然也可以这样做。如果是的话您擅长任何命令shell或脚本语言,您可以调用XSLT处理器并连接结果“文档和样式表格式严重错误,在解析时会产生错误。请提供好的!!!比如:
Sr.Engineer
不需要占用很多人的时间,同时为他们提供了一个完整的代码Michael,谢谢,但是如果每个类别的数据字段都不同呢?例如,在更新数据中,如果我不希望填充国家/地区数据值,在终止数据中,如果只填充用户ID?您可以使用不同的模板匹配
wd:Report\u Entry
-每个模板都有自己的
模式,我使用了不同的模板来匹配wd:Report\u条目和它自己的数据字段。但它会返回所有其他模板的最后一个模板数据。例如,对于第三个模板匹配,如果我只返回userid,第一个和第二个模板也只返回userid,尽管它在模板中有其他数据字段。有什么想法吗?为了避免这种情况,我在需要的地方使用了“如果”条件。@James你理解“每个都有自己的
模式”
?马丁,谢谢。这看起来有点棘手,但让我试试。@James,有什么建议对你有用吗?没有,马丁,看起来我接近下面的建议,但因为它没有ETV/XTT步骤。它不起作用。