我有xml如下,
<p>
我需要的是摆脱具有属性edit或foot的<section>
个节点,并将它们添加到 <doc>
<section>
<p note="front"></p>
<c>content</c>
</section>
<p note="edit"></p>
<p note="foot"></p>
<section>
.......
</section>
</doc>
节点的末尾。
所以输出应该是
<xsl:template match="p[@note='edit']"/>
<xsl:template match="p[@note='foot']"/>
我可以通过简单地使用如下的空模板来删除那些节点,
<section>
但我不知道任何方法如何将这些被删除的节点放在permessage-deflate
节点的末尾。
有任何建议我该怎么做?
提前致谢
答案 0 :(得分:2)
您可以尝试这种方式:
<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:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="section">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
<xsl:copy-of select="p[@note='edit' or @note='foot']"/>
</xsl:template>
<xsl:template match="p[@note='edit' or @note='foot']"/>
</xsl:stylesheet>
简要说明:
<xsl:template match="node()|@*">...
:身份模板。我只是假设你熟悉它。<xsl:template match="section">...
:这就是将当前<p>
之后具有属性编辑或脚'的'<section>
节点复制到该位置的逻辑<xsl:template match="p[@note='edit' or @note='foot']"/>
:空模板,用于从原始位置移除'<p>
节点,这些节点具有属性编辑或脚'。答案 1 :(得分:1)
对于这种情况,我建议使用xsl:在与该部分匹配的模板内选择。 此模板创建section元素并重新排序节点。
<xsl:template match="section">
<xsl:choose>
<xsl:when test="p[@note= 'front']">
<section>
<xsl:apply-templates select="p[@note= 'front'] | c"/>
</section>
<xsl:apply-templates select="p[@note != 'front']"/>
</xsl:when>
<xsl:otherwise>
<section>
<xsl:apply-templates/>
</section>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
答案 2 :(得分:1)
或者简单地说:
XSLT 2.0
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="section">
<xsl:variable name="footnotes" select="p[@note='edit' or @note='foot']" />
<xsl:copy>
<xsl:apply-templates select="@*|node() except $footnotes"/>
</xsl:copy>
<xsl:apply-templates select="$footnotes"/>
</xsl:template>
</xsl:stylesheet>
答案 3 :(得分:0)
在XSLT的某处,有&lt; section&gt;的输出。元素,你在里面使用&lt; xsl:template match =&#34; p [@note =&#39; edit&#39;]&#34; /&gt; (和脚)作为空模板,以避免插入这些(我猜) 就在&lt; section&gt;之后元素你可以使用元素
<xsl:template match="/doc/section/p[@note='edit']|/doc/section/p[@note='foot']">
<xsl:copy-of select="."/>
</xsl:template>
在这里插入这些。