如何使用XSLT将元素复制到组中存在的所有元素

时间:2018-12-20 03:34:58

标签: xslt xpath

我有一个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'元素,请有人对此提供帮助。

1 个答案:

答案 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>

查看实际情况https://xsltfiddle.liberty-development.net/bFDb2Dq