如何解决XSLT:将元素的文本传输到父元素,并删除元素
|| 这是我的XML:<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<?xml-stylesheet href=\"test_2.xsl\" type=\"text/xsl\"?>
<doc xmlns=\"http://www.foo.org\">
<div>
<title>Mr. Title</title>
<paragraph>This is one paragraph.
</paragraph>
<paragraph>Another paragraph.
</paragraph>
<list>
<orderedlist>
<item>
<paragraph>An item paragraph.</paragraph>
</item>
<item>
<paragraph>Another item paragraph</paragraph>
</item>
</orderedlist>
</list>
</div>
</doc>
我的XML摆脱了列表,将orderedlist更改为ol,将项目更改为li。现在,在将文本传输到新li时,我想摆脱那些属于item子项的段落节点。请注意,我不想摆脱不是项子项的段落节点。
到目前为止,这是我的XSLT:
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<xsl:stylesheet version=\"1.0\"
xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"
xmlns:foo=\"http://www.foo.org\">
<xsl:output method=\"xml\" version=\"1.0\" encoding=\"UTF-8\" indent=\"yes\"/>
<xsl:template match=\"node()|@*\">
<xsl:copy>
<xsl:apply-templates select=\"node()|@*\"/>
</xsl:copy>
</xsl:template>
<xsl:template match=\"foo:doc\">
<xsl:element name=\"newdoc\" namespace=\"http://www/w3.org/1999/xhtml\">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match=\"foo:div\">
<segment title=\"{foo:title}\">
<xsl:apply-templates/>
</segment>
</xsl:template>
<xsl:template match=\"foo:title\">
<xsl:element name=\"h2\">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match=\"foo:paragraph\">
<xsl:element name=\"p\">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match=\"foo:list\">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match=\"foo:orderedlist\">
<xsl:element name=\"ol\">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
<xsl:template match=\"foo:item\">
<xsl:element name=\"li\">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
输出是这样的:
<newdoc xmlns=\"http://www/w3.org/1999/xhtml\">
<segment xmlns=\"\" title=\"Mr. Title\">
<h2>Mr. Title</h2>
<p>This is one paragraph.
</p>
<p>Another paragraph.
</p>
<ol>
<li>
<p>An item paragraph.</p>
</li>
<li>
<p>Another item paragraph</p>
</li>
</ol>
</segment>
</newdoc>
奖励:我也想摆脱空白行,并纠正由于消除列表节点而导致的怪异格式
<xsl:template match=\"foo:list\">
<xsl:apply-templates/>
</xsl:template>
因此,如果有人知道删除节点的更好方法,我很想听听它。
非常感谢!解决方法
只需为列表的子级添加更具体的规则即可:
<xsl:template match=\"foo:item/foo:paragraph\">
<xsl:apply-templates/>
</xsl:template>
如果我对问题的理解正确,那么这同样适用于您的奖励问题:不要复制作为列表元素的子元素的纯空白文本节点。
<xsl:template match=\"foo:item/text()[normalize-space(.)=\'\']\" />
,此样式表:
<xsl:stylesheet version=\"1.0\"
xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"
xmlns:foo=\"http://www.foo.org\"
xmlns=\"http://www/w3.org/1999/xhtml\"
exclude-result-prefixes=\"foo\">
<xsl:output method=\"xml\" version=\"1.0\" encoding=\"UTF-8\" indent=\"yes\"/>
<xsl:strip-space elements=\"*\"/>
<xsl:preserve-space elements=\"foo:paragraph\"/>
<xsl:template match=\"foo:doc\">
<newdoc>
<xsl:apply-templates/>
</newdoc>
</xsl:template>
<xsl:template match=\"foo:div\">
<segment title=\"{foo:title}\">
<xsl:apply-templates/>
</segment>
</xsl:template>
<xsl:template match=\"foo:title\">
<h2>
<xsl:apply-templates/>
</h2>
</xsl:template>
<xsl:template match=\"foo:paragraph\">
<p>
<xsl:apply-templates/>
</p>
</xsl:template>
<xsl:template match=\"foo:orderedlist\">
<ol>
<xsl:apply-templates/>
</ol>
</xsl:template>
<xsl:template match=\"foo:item\">
<li>
<xsl:apply-templates/>
</li>
</xsl:template>
<xsl:template match=\"foo:item/foo:paragraph\">
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
输出:
<newdoc xmlns=\"http://www/w3.org/1999/xhtml\">
<segment title=\"Mr. Title\">
<h2>Mr. Title</h2>
<p>This is one paragraph. </p>
<p>Another paragraph. </p>
<ol>
<li>An item paragraph.</li>
<li>Another item paragraph</li>
</ol>
</segment>
</newdoc>
注意:目前,您的样式表是一堆混乱的命名空间。使用@exclude-result-prefixes
。通过xsl:strip-space
和xsl:preserve-space
声明更正仅空白文本节点。版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。