XSLT1.0-将特定元素之前的节点转换为其他元素
我有以下意见:XSLT1.0-将特定元素之前的节点转换为其他元素,xslt,xslt-1.0,Xslt,Xslt 1.0,我有以下意见: <p> XYZZ <nl/> DEF <process>gggg</process> KKK <nl/> JKLK <nl/> QQQQ </p> 我需要按元素划分的每个节点在元素中输出: ` 请告诉我获取指定输出的方法。此转换: 应用于提供的XML文档时: 生成所需的正确结果: 请注意: 标识规则用于按原样复制节点 存在与
<p>
XYZZ
<nl/>
DEF
<process>gggg</process>
KKK
<nl/>
JKLK
<nl/>
QQQQ
</p>
我需要按元素划分的每个节点在元素中输出:
`
请告诉我获取指定输出的方法。此转换:
应用于提供的XML文档时:
生成所需的正确结果:
请注意:
标识规则用于按原样复制节点
存在与top元素、top元素的第一个nl子元素和top元素的任何nl子元素匹配的特定模板
定义了两个键,用于选择nl元素前面的所有非nl节点和nl元素后面的所有节点
nl元素被title元素替换,紧跟其后的所有非nl节点都被处理,结果被放入该title元素
对于其父nl元素的第一个子元素,有一个初始步骤,在该步骤中添加一个title元素,并处理前面所有的非nl节点,然后将结果放入该title元素。然后执行步骤4中的处理。执行上述步骤
好问题,+1。请参阅我的答案,以获得一个完整且简短的、也是最有效的解决方案。我已仔细解释了此解决方案中的所有步骤:非常感谢,Dimitre.:这对我很有效。这也让我清楚了使用key,generate ID函数的概念-+回答得好。您还可以为第一个组使用一个键和一个空键值。但这更清楚,更真实。
<p>
<title>XYZZ</title>
<title>
DEF<process>gggg</process>KKK
</title>
<title>JKLK</title>
<title>QQQQ</title>
</p>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kFollowing" match="/*/node()[not(self::nl)]"
use="generate-id(preceding-sibling::nl[1])"/>
<xsl:key name="kPreceding" match="/*/node()[not(self::nl)]"
use="generate-id(following-sibling::nl[1])"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<xsl:copy>
<xsl:apply-templates select="@*|nl"/>
</xsl:copy>
</xsl:template>
<xsl:template match="nl" name="groupFollowing">
<title>
<xsl:apply-templates select="key('kFollowing',generate-id())"/>
</title>
</xsl:template>
<xsl:template match="nl[1]">
<title>
<xsl:apply-templates select="key('kPreceding',generate-id())"/>
</title>
<xsl:call-template name="groupFollowing"/>
</xsl:template>
</xsl:stylesheet>
<p>
XYZZ
<nl/>
DEF
<process> gggg </process>
KKK
<nl/>
JKLK
<nl/>
QQQQ
</p>
<p>
<title>
XYZZ
</title>
<title>
DEF
<process> gggg </process>
KKK
</title>
<title>
JKLK
</title>
<title>
QQQQ
</title>
</p>