我有多个ENTRY元素,其中包含其他一些元素:
<ENTRY>
<HEAD>samplehead</HEAD>
<NUM>1</NUM>
<EXPL></EXPL>
<TRAN></TRAN>
<NUM>2 </NUM>
<EXPL></EXPL>
<COMP></COMP>
<NUM>3 </NUM>
<TRAN></TRAN>
<DIS></DIS>
</ENTRY>
我想基于num元素添加一个新的主体,所以我最终会用
<element>
<body>
<expl></expl>
<tran></tran>
</body>
<body>
<expl></expl>
<comp>/comp>
</body>
<body>
<tran></tran>
<dis></dis>
</body>
</element>
如何使用xslt 1.0实现这一目标?
提前感谢:)
答案 0 :(得分:0)
您可以从身份模板开始
<!-- override the ENTRY node -->
<xsl:template match="ENTRY">
<element>
<!-- loop for each NUM node -->
<xsl:for-each select="NUM">
<!-- store the current generate-id() -->
<xsl:variable name="ID" select="generate-id(.)"/>
<body>
<!-- apply following nodes, excluding the NUM node -->
<xsl:apply-templates select="following-sibling::*[not(self::NUM)][generate-id(preceding-sibling::NUM[1]) = $ID]"/>
</body>
</xsl:for-each>
</element>
</xsl:template>
然后是覆盖模板
<?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="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="ENTRY">
<element>
<xsl:for-each select="NUM">
<xsl:variable name="ID" select="generate-id(.)"/>
<body>
<xsl:apply-templates select="following-sibling::*[not(self::NUM)][generate-id(preceding-sibling::NUM[1]) = $ID]"/>
</body>
</xsl:for-each>
</element>
</xsl:template>
</xsl:stylesheet>
因此整个样式表:
{{1}}