如何使用XSLT
将不同的元素包装在一个root元素中我的XML代码是:
<section>
<body>
<p>Trying text</p>
<Head>Heading 1</Head>
<ListItem1>item 1</ListItem1>
<ListItem2>item 2</ListItem2>
<ListItem2>item 3</ListItem2>
<ListItem3>item 4</ListItem3>
<ListItem4>item 4</ListItem4>
<ListItem1>item 1</ListItem1>
<ListItem2>item 2</ListItem2>
<ListItem2>item 3</ListItem2>
<ListItem3>item 4</ListItem3>
<ListItem3>item 4</ListItem3>
<ListItem4>item 4</ListItem4>
<ListItem3>item 4</ListItem3>
<ListItem1>item 1</ListItem1>
<ListItem2>item 2</ListItem2>
<ListItem2>item 3</ListItem2>
<ListItem3>item 4</ListItem3>
<ListItem3>item 4</ListItem3>
<ListItem2>item 2</ListItem2>
<ListItem2>item 3</ListItem2>
<Head>Heading 2</Head>
<ListItem1>item 1</ListItem1>
<ListItem2>item 2</ListItem2>
<ListItem2>item 3</ListItem2>
<ListItem3>item 4</ListItem3>
<ListItem1>item 1</ListItem1>
<ListItem2>item 2</ListItem2>
<ListItem2>item 3</ListItem2>
<ListItem3>item 4</ListItem3>
<ListItem1>item 1</ListItem1>
<ListItem2>item 2</ListItem2>
<ListItem2>item 3</ListItem2>
<ListItem3>item 4</ListItem3>
<ListItem3>item 4</ListItem3>
<ListItem2>item 2</ListItem2>
<ListItem2>item 3</ListItem2>
</body>
</section>
xslt我正在使用:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy copy-namespaces="no">
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Section">
<Section>
<xsl:apply-templates/>
</Section>
</xsl:template>
<xsl:template match="ListItem1">
<div>
<title><xsl:call-template name="ListItem"/></title>
</div>
<xsl:apply-templates select="following-sibling::node()
[not(self::ListItem1|ListItem2)][1]"/>
</xsl:template>
</xsl:stylesheet>
输出需要:
包装ListItem1,2,3,4在一个根元素中,然后朝着一个root元素
逐渐发展<Notes>
<p>Trying text</p>
<div>
<title>Heading 1</title>
<entry>
<primary>item 1</primary>
<secondary>item 2</secondary>
<secondary>item 3</secondary>
<teritary level="1">item 4</teritary>
<teritary level="2">item 4</teritary>
</entry>
<entry>
<primary>item 1</primary>
<secondary>item 2</secondary>
<secondary>item 3</secondary>
<teritary level="1">item 4</teritary>
<teritary level="1">item 4</teritary>
<teritary level="2">item 4</teritary>
<teritary level="1">item 4</teritary>
</entry>
<entry>
<primary>item 1</primary>
<secondary>item 2</secondary>
<secondary>item 3</secondary>
<teritary level="1">item 4</teritary>
<teritary level="1">item 4</teritary>
<secondary>item 2</secondary>
<secondary>item 3</secondary>
</entry>
</div>
<div>
<title>Heading 2</title>
<entry>
<primary>item 1</primary>
<secondary>item 2</secondary>
<secondary>item 3</secondary>
<teritary level="1">item 4</teritary>
</entry>
<entry>
<primary>item 1</primary>
<secondary>item 2</secondary>
<secondary>item 3</secondary>
<teritary level="1">item 4</teritary>
</entry>
<entry>
<primary>item 1</primary>
<secondary>item 2</secondary>
<secondary>item 3</secondary>
<teritary level="1">item 4</teritary>
<teritary level="1">item 4</teritary>
<secondary>item 2</secondary>
<secondary>item 3</secondary>
</entry>
</div>
</Notes>
请帮助我
预先感谢
这是一个样式表进行包装(div
和entry
(:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="2.0">
<xsl:output indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* , node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="section">
<xsl:copy>
<xsl:for-each-group select="*" group-starting-with="Head">
<xsl:choose>
<xsl:when test="self::Head">
<div>
<title>
<xsl:apply-templates/>
</title>
<xsl:for-each-group select="current-group() except ." group-starting-with="ListItem1">
<entry>
<xsl:apply-templates select="current-group()"/>
</entry>
</xsl:for-each-group>
</div>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="current-group()"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
<xsl:template match="ListItem1">
<primary>
<xsl:apply-templates/>
</primary>
</xsl:template>
<xsl:template match="ListItem2">
<secondary>
<xsl:apply-templates/>
</secondary>
</xsl:template>
<xsl:template match="ListItem3 | ListItem4">
<tertiary>
<xsl:apply-templates/>
</tertiary>
</xsl:template>
</xsl:stylesheet>
输出是
<?xml version="1.0" encoding="UTF-8"?>
<section>
<p>Trying text</p>
<div>
<title>Heading 1</title>
<entry>
<primary>item 1</primary>
<secondary>item 2</secondary>
<secondary>item 3</secondary>
<tertiary>item 4</tertiary>
<tertiary>item 4</tertiary>
</entry>
<entry>
<primary>item 1</primary>
<secondary>item 2</secondary>
<secondary>item 3</secondary>
<tertiary>item 4</tertiary>
<tertiary>item 4</tertiary>
<tertiary>item 4</tertiary>
<tertiary>item 4</tertiary>
</entry>
<entry>
<primary>item 1</primary>
<secondary>item 2</secondary>
<secondary>item 3</secondary>
<tertiary>item 4</tertiary>
<tertiary>item 4</tertiary>
<secondary>item 2</secondary>
<secondary>item 3</secondary>
</entry>
</div>
<div>
<title>Heading 2</title>
<entry>
<primary>item 1</primary>
<secondary>item 2</secondary>
<secondary>item 3</secondary>
<tertiary>item 4</tertiary>
</entry>
<entry>
<primary>item 1</primary>
<secondary>item 2</secondary>
<secondary>item 3</secondary>
<tertiary>item 4</tertiary>
</entry>
<entry>
<primary>item 1</primary>
<secondary>item 2</secondary>
<secondary>item 3</secondary>
<tertiary>item 4</tertiary>
<tertiary>item 4</tertiary>
<secondary>item 2</secondary>
<secondary>item 3</secondary>
</entry>
</div>
</section>
到目前为止,我还没有看到level
属性来自何处或将其添加到哪个元素的规则,似乎使用
<xsl:template match="ListItem3">
<tertiary level="1">
<xsl:apply-templates/>
</tertiary>
</xsl:template>
<xsl:template match="ListItem4">
<tertiary level="2">
<xsl:apply-templates/>
</tertiary>
</xsl:template>
而不是
<xsl:template match="ListItem3 | ListItem4">
<tertiary>
<xsl:apply-templates/>
</tertiary>
</xsl:template>
给您的样本提供了正确的结果。