我有一个Input xml,使用下面的XSL转换,我能够将deptId作为子元素添加到'Employees'元素中,但是我想将其作为子元素添加到每个'employee'元素中。到XSLT时,我尝试了以下转换,但未获得所需的输出
输入XML:
if ($num_rows == 0) {
$data['Status'] = '<:SHOW_NO_PREMIUM_STATUS:>';
$days_remaining = 0;
}
else {
$days_remaining = $data['PremiumDays'] - date_create($data['PremiumStartTime'])->diff(date_create())->days;
if ($days_remaining <= 0) {
$data['Status'] = '<:SHOW_NO_PREMIUM_STATUS:>';
}
else {
$data['Status'] = '<b><font size="2" color="red">Premium is active - <%Days_Remaining%> days remaining.</font></b>';
}
}
$replace = array(
'account_status' => $data['Status'],
'days_remaining' => $days_remaining
);
XSL转换:
<?xml version="1.0" encoding="UTF-8"?>
<rootnode>
<companyName>ABC</companyName>
<deptId>12</deptId>
<employee>
<name>n1</name>
<empid>e1</empid>
</employee>
<employee>
<name>n2</name>
<empid>e2</empid>
</employee>
<employee>
<name>n3</name>
<empid>e3</empid>
</employee>
</rootnode>
输出xml:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/rootnode">
<xsl:copy>
<xsl:copy-of select="companyName"/>
<xsl:copy-of select="deptId"/>
<employees>
<xsl:copy-of select="employee"/>
<xsl:copy-of select="deptId"/>
</employees>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
必需的输出:
<?xml version="1.0" encoding="UTF-8"?>
<rootnode>
<companyName>ABC</companyName>
<deptId>D1</deptId>
<employees>
<employee>
<name>n1</name>
<empid>e1</empid>
</employee>
<employee>
<name>n2</name>
<empid>e2</empid>
</employee>
<employee>
<name>n3</name>
<empid>e3</empid>
</employee>
<deptId>D1</deptId>
</employees>
</rootnode>
我希望将deptId复制到'employees'元素下的所有'employee'元素,请有人对此提供帮助。
答案 0 :(得分:1)
在rootnode
模板匹配中,您可以执行以下操作:
<xsl:template match="rootnode">
<xsl:copy>
<xsl:copy-of select="node()[not(self::employee)]"/>
<employees>
<xsl:apply-templates select="employee"/>
</employees>
</xsl:copy>
</xsl:template>
,即复制根节点,复制除employee
以外的所有子节点。然后将所有employee
节点放入employees
然后,在您的employee
模板匹配中,您可以执行以下操作:
<xsl:template match="employee">
<xsl:copy>
<xsl:copy-of select="node()"/>
<xsl:copy-of select="preceding-sibling::deptId"/>
</xsl:copy>
</xsl:template>
也就是说,复制节点及其子节点,然后复制前一个兄弟节点deptId
。
整个样式表在下面
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:strip-space elements="*"/>
<xsl:output indent="yes"/>
<xsl:template match="rootnode">
<xsl:copy>
<xsl:copy-of select="node()[not(self::employee)]"/>
<employees>
<xsl:apply-templates select="employee"/>
</employees>
</xsl:copy>
</xsl:template>
<xsl:template match="employee">
<xsl:copy>
<xsl:copy-of select="node()"/>
<xsl:copy-of select="preceding-sibling::deptId"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>