我需要动态创建XML文档。这个XML节点的一些属性包含上标Reg等。我的问题是我应该如何在XML中存储这些上标字符,然后使用XSL将其读取为HTML。示例XML如下所示:
<?xml version="1.0" encoding="utf-8"?>
<node name="Some text <sup>®</sup>"/>
我知道这不能存储在属性中的sup标签下,因为它会破坏XML。我尝试使用<sup>
代替打开和关闭标记。但是它们在HTML上呈现为<sup>
而不是实际上是上标。
请让我知道这个问题的解决方案。我控制着XML的生成。我可以用正确的方式写它,如果我知道什么是存储上标的正确方法。
答案 0 :(得分:2)
由于您正在使用XSL将输入转换为HTML,我建议使用不同的方法来编码某些事情需要上标的事实。组成您自己的简单标记,例如
<node name="Some text [[®]]"/>
标记可以是您以后可以唯一标识的任何内容,并且不会在数据中自然发生。然后在您的XSL流程中,可以包含此标记的属性值以及将特殊标记转换为<sup>
和</sup>
的自定义模板。这允许您保留文档结构(即不将这些字符串值移动到文本节点)并仍然实现您的目标。
答案 1 :(得分:1)
请让我知道此问题的解决方案。我有控制权 生成XML。如果我知道是什么,我可以用正确的方式写出来 存储上标的正确方法。
因为属性只能包含值(没有节点),所以解决方案是在元素中存储标记(节点):
<node>
<name>Some text <sup>®</sup></name>
</node>
答案 2 :(得分:0)
如果只有像®这样的单个字符需要制作上标,那么你可以保留XML而不像<sup>
这样的骗子,比如
<node name="Some text ®"/>
并在处理过程中查找要上标的字符。像这样的模板可能有所帮助:
<xsl:template match="node/@name">
<xsl:param name="nameString" select="string()"/>
<!-- We're stepping through the string character by character -->
<xsl:variable name="firstChar" select="substring($nameString,1,1)"/>
<xsl:choose>
<!-- '®' can be extended to be a longer string of single characters
that are meant to be turned into superscript -->
<xsl:when test="contains('®',$firstChar)">
<sup><xsl:value-of select="$firstChar"/></sup>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$firstChar"/>
</xsl:otherwise>
</xsl:choose>
<!-- If we we didn't yet step through the whole string,
chop off the first character and recurse. -->
<xsl:if test="$firstChar!=''">
<xsl:apply-templates select=".">
<xsl:with-param name="nameString" select="substring($nameString,2)"/>
</xsl:apply-templates>
</xsl:if>
</xsl:template>
然而,这种方法效率不高,特别是如果您有很多name
属性和/或非常长的name
属性。如果您的应用程序对性能至关重要,那么最好先测试对处理时间的影响是否合理。