如何使用XSLT将一个元素复制到组中的所有元素
我有一个输入xml,使用下面的XSL转换,我可以将deptId作为子元素添加到“Employees”元素,但我想将其作为子元素添加到每个“Employees”元素。我是XSLT新手,我尝试了下面的转换,但没有获得所需的输出 输入XML:如何使用XSLT将一个元素复制到组中的所有元素,xslt,xpath,Xslt,Xpath,我有一个输入xml,使用下面的XSL转换,我可以将deptId作为子元素添加到“Employees”元素,但我想将其作为子元素添加到每个“Employees”元素。我是XSLT新手,我尝试了下面的转换,但没有获得所需的输出 输入XML: <?xml version="1.0" encoding="UTF-8"?> <rootnode> <companyName>ABC</companyName> <deptId>12&l
<?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>
基础知识
12
n1
e1
氮气
e2
n3
e3
XSL转换:
<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:
<?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>
基础知识
D1
n1
e1
氮气
e2
n3
e3
D1
所需输出:
<?xml version="1.0" encoding="UTF-8"?>
<rootnode>
<companyName>ABC</companyName>
<deptId>12</deptId>
<employees>
<employee>
<name>n1</name>
<empid>e1</empid>
<deptId>12</deptId>
</employee>
<employee>
<name>n2</name>
<empid>e2</empid>
<deptId>12</deptId>
</employee>
<employee>
<name>n3</name>
<empid>e3</empid>
<deptId>12</deptId>
</employee>
</employees>
</rootnode>
基础知识
12
n1
e1
12
氮气
e2
12
n3
e3
12
我想将deptId复制到“employees”元素下的所有“employeer”元素,有人能帮我一下吗。在您的
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>
<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>
查看操作。整个文档中是否始终只有一个
deptId
?是的,只有一个deptId