XML 文档到 XHTML 文档的 XSLT 转换
这是我的模板:
<xsl:template name="rec">
<xsl:for-each select="*">
<div class="{local-name()}">
<xsl:for-each select="@*">
<xsl:attribute name="data-{local-name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:for-each>
<xsl:value-of select="text()" />
<xsl:call-template name="rec" />
</div>
</xsl:for-each>
</xsl:template>
给定一个像这样的文档:
<test>
<item value="1">Item 1 Text</item>
<item value="2">Item 2 Text</item>
</test>
上面的转换将把它变成:
<div class="test">
<div class="item" data-value="1">Item 1 Text</div>
<div class="item" data-value="2">Item 2 Text</div>
</div>
我遇到的问题是,这个转换没有正确尊重文本节点,而且我没有足够的 XSLT 背景来弄清楚如何修复它。问题是这样的:给定 xml,如下所示:
<para>This is a <emphasis>paragraph</emphasis> people!</para>
我想看到以下输出:
<div class="para">This is a <div class="emphasis">paragraph</div> people!</div>
问题是我没有得到这个 - 我得到了这个:
<div class="para">This is a <div class="emphasis">paragraph</div></div>
注意缺少的“人!”文本节点。如何修复上面的 XSLT 以提供我需要的输出?
Here's my template:
<xsl:template name="rec">
<xsl:for-each select="*">
<div class="{local-name()}">
<xsl:for-each select="@*">
<xsl:attribute name="data-{local-name()}">
<xsl:value-of select="."/>
</xsl:attribute>
</xsl:for-each>
<xsl:value-of select="text()" />
<xsl:call-template name="rec" />
</div>
</xsl:for-each>
</xsl:template>
Given a document like so:
<test>
<item value="1">Item 1 Text</item>
<item value="2">Item 2 Text</item>
</test>
The above transform will turn it into:
<div class="test">
<div class="item" data-value="1">Item 1 Text</div>
<div class="item" data-value="2">Item 2 Text</div>
</div>
The problem I'm having, is that this transform doesn't respect text nodes properly, and I don't have enough background with XSLT to figure out how to fix it. Here's the problem: given xml like so:
<para>This is a <emphasis>paragraph</emphasis> people!</para>
I would like to see the following output:
<div class="para">This is a <div class="emphasis">paragraph</div> people!</div>
The problem is that I'm not getting this - I'm getting this:
<div class="para">This is a <div class="emphasis">paragraph</div></div>
Notice the missing 'people!' text node. How can I fix my XSLT above to provide me with the output I need?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
一个问题是
仅选择第一个子文本节点的值并将其输出。
正确执行此操作的最简单方法可能是使用
而不是
。然后,
和
您可以使用
来将适当的模板按顺序应用于每个子元素和文本节点,而不是跳过任何模板。
这是一个完整的实现:
请注意
,它在没有显式的情况下默认对上下文节点的所有子节点(包括文本节点)进行操作选择
属性。默认模板用于文本节点。该模板只是将它们复制到输出中。
示例输入:
产生所需的输出:
One problem is that
just selects the value of the first child text node, and outputs it.
The easiest way to do this right is probably to use
<xsl:apply-templates>
instead of<xsl:call-template>
.Then instead of
and
you can use
which will apply the appropriate template to each child element and text node, in order, not skipping any.
Here is a complete implementation:
Note the
<xsl:apply-templates/>
, which operates on all children of the context node, including text nodes, by default in absence of an explicitselect
attribute.A default template is used for text nodes. This template simply copies them to the output.
Sample input:
produces the desired output: