这是我的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时删除作为项目子项的段落节点。请注意,我不想删除不是项目子项的段落节点。
到目前为止,这是我的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>
所以,如果有人知道删除节点的更好方法,我很乐意听到它。
非常感谢!
答案 0 :(得分:1)
只需为列表子项的段落添加更具体的规则:
<xsl:template match="foo:item/foo:paragraph">
<xsl:apply-templates/>
</xsl:template>
如果我正确理解了这个问题,同样适用于你的红利问题:不要复制作为列表元素子元素的纯空白文本节点。
<xsl:template match="foo:item/text()[normalize-space(.)='']" />
答案 1 :(得分:1)
此样式表:
<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
声明仅校正空白文本节点。