Xml XSLT-将xsl:template输出包装到标记中
我需要接收1.XML文件,并输出N个文件,它们是输入文件的子集。该子集基于2个节点的谓词检查。我的计划是在XSLT模板上运行输入文件N次,以输出每个文件 我的输入如下所示:Xml XSLT-将xsl:template输出包装到标记中,xml,xslt,Xml,Xslt,我需要接收1.XML文件,并输出N个文件,它们是输入文件的子集。该子集基于2个节点的谓词检查。我的计划是在XSLT模板上运行输入文件N次,以输出每个文件 我的输入如下所示: <employee_data> <employees> <employee id="1"> <first_name>2sk8d</first_name> <agency_code>38</agency_code&
<employee_data>
<employees>
<employee id="1">
<first_name>2sk8d</first_name>
<agency_code>38</agency_code>
<offices_administered>
<office_administered office_identifier="ALLPOIs" agency_code="HL" />
</offices_administered>
</employee>
<employee id="2">
<first_name>2sk8d</first_name>
<agency_code>24</agency_code>
<offices_administered>
<office_administered office_identifier="ALLPOIs" agency_code="22" />
</offices_administered>
</employee>
<employee id="3">
<first_name>2sk8d</first_name>
<agency_code>22</agency_code>
<offices_administered>
<office_administered office_identifier="ALLPOIs" agency_code="HL" />
</offices_administered>
</employee>
</employees>
我的XSLT看起来像这样
<?xml version="1.0" encoding="utf-8"?>
我的问题是,我的输出不包含EmployeeData或Employees根/父节点
如果我将xslt更改为放入第一个xsl:template匹配,那么这些标记将重复多次/
如果我将匹配谓词更改为/employee\u data/employees[employee/agency\u code='22'或employee/offices\u administrated/office\u administrated/@agency\u code='22'],那么我将获得所有员工
这几乎就像我想要一些魔法,将我的整个匹配输出包装在我的两个父标记中。根据我从这个问题中了解到的,你想要这样的东西:
<employee_data>
<employees>
<employee id="1">
<first_name>2sk8d</first_name>
<agency_code>38</agency_code>
<offices_administered>
<office_administered office_identifier="ALLPOIs" agency_code="HL" />
</offices_administered>
</employee>
<employee id="2">
<first_name>2sk8d</first_name>
<agency_code>24</agency_code>
<offices_administered>
<office_administered office_identifier="ALLPOIs" agency_code="22" />
</offices_administered>
</employee>
<employee id="3">
<first_name>2sk8d</first_name>
<agency_code>22</agency_code>
<offices_administered>
<office_administered office_identifier="ALLPOIs" agency_code="HL" />
</offices_administered>
</employee>
</employees>
@戴夫,不客气。我更新了解决方案,使其简单化了。@Dave,另请参见上次更新:如果您有可用的XSLT 2.0处理器,只需执行一次转换即可创建所有N个文件。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<employee_data>
<employees>
<xsl:apply-templates select=
"/*/employees/employee
[agency_code='22'
or offices_administered/office_administered/@agency_code='22']"/>
</employees>
</employee_data>
</xsl:template>
<xsl:template match="employee">
<xsl:copy-of select="."/>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:message terminate="no">
Catch 1 <xsl:value-of select="name()"/>
</xsl:message>
</xsl:template>
</xsl:stylesheet>
<employee_data>
<employees>
<employee id="1">
<first_name>2sk8d</first_name>
<agency_code>38</agency_code>
<offices_administered>
<office_administered office_identifier="ALLPOIs" agency_code="HL" />
</offices_administered>
</employee>
<employee id="2">
<first_name>2sk8d</first_name>
<agency_code>24</agency_code>
<offices_administered>
<office_administered office_identifier="ALLPOIs" agency_code="22" />
</offices_administered>
</employee>
<employee id="3">
<first_name>2sk8d</first_name>
<agency_code>22</agency_code>
<offices_administered>
<office_administered office_identifier="ALLPOIs" agency_code="HL" />
</offices_administered>
</employee>
</employees>
</employee_data>
<employee_data>
<employees>
<employee id="2">
<first_name>2sk8d</first_name>
<agency_code>24</agency_code>
<offices_administered>
<office_administered office_identifier="ALLPOIs" agency_code="22"/>
</offices_administered>
</employee>
<employee id="3">
<first_name>2sk8d</first_name>
<agency_code>22</agency_code>
<offices_administered>
<office_administered office_identifier="ALLPOIs" agency_code="HL"/>
</offices_administered>
</employee>
</employees>
</employee_data>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="pCodes" as="xs:string+" select="'22', '38'"/>
<xsl:variable name="vDoc" select="/"/>
<xsl:template match="/">
<xsl:for-each select="$pCodes">
<xsl:variable name="vCode" select="."/>
<xsl:result-document href="'Agency'{.}.xml">
<employee_data>
<employees>
<xsl:apply-templates select=
"$vDoc/*/employees/employee
[agency_code=$vCode
or offices_administered/office_administered
/@agency_code=$vCode]"/>
</employees>
</employee_data>
</xsl:result-document>
</xsl:for-each>
</xsl:template>
<xsl:template match="employee">
<xsl:copy-of select="."/>
</xsl:template>
<xsl:template match="@* | node()">
<xsl:message terminate="no">
Catch 1 <xsl:value-of select="name()"/>
</xsl:message>
</xsl:template>
</xsl:stylesheet>
Saxon 9.1.0.5J from Saxonica
Java version 1.6.0_31
Stylesheet compilation time: 610 milliseconds
Processing file:/C:/Program%20Files/Java/jre6/bin/marrowtr.xml
Building tree for file:/C:/Program%20Files/Java/jre6/bin/marrowtr.xml using class net.sf.saxon.tinytree.TinyBuilder
Tree built in 0 milliseconds
Tree size: 25 nodes, 21 characters, 9 attributes
Loading net.sf.saxon.event.MessageEmitter
Writing to file:/C:/Program%20Files/Java/jre6/bin/'Agency'22.xml
Writing to file:/C:/Program%20Files/Java/jre6/bin/'Agency'38.xml
Execution time: 94 milliseconds
Memory used: 11464160
NamePool contents: 26 entries in 26 chains. 6 prefixes, 7 URIs