我有以下输入:
<p>
XYZZ
<nl/>
DEF
<process>gggg</process>
KKK
<nl/>
JKLK
<nl/>
QQQQ
</p>
我需要在元素<nl/>
中输出由元素<title>
分隔的每个节点:
<p>
<title>XYZZ</title>
<title>
DEF<process>gggg</process>KKK
</title>
<title>JKLK</title>
<title>QQQQ</title>
</p>
` 请告诉我获取指定输出的方法。
答案 0 :(得分:0)
此转化:
<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>
应用于提供的XML文档:
<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>
请注意:
使用身份规则“按原样”复制节点。
有与顶部元素匹配的特定模板,顶部元素的第一个nl
子元素和顶部元素的任何nl
子元素。
定义了两个键,用于选择紧跟在nl
元素之前的所有非nl
节点以及紧跟{{1}的所有节点元素。
将nl
元素替换为nl
元素,并处理所有紧随其后的非title
个节点,并将结果放入进入此nl
元素。
对于第一个(其父级的子级)title
元素,有一个初始步骤,其中添加了nl
元素,并且所有紧接在前的非元素 - 处理title
个节点,并将结果放入此nl
元素中。然后执行上面步骤4中的处理。