1

我有一个需要动态创建 XML 文档的要求。这个 XML 的节点的一些属性包含上标 Reg 等。我的问题是我应该如何将这些上标字符存储在 XML 中,然后使用 XSL 读取它以呈现为 HTML。示例 XML 如下所示:

<?xml version="1.0" encoding="utf-8"?>
<node name="Some text <sup>®</sup>"/>  

我知道这不能存储在属性内的 sup 标记下,因为它会破坏 XML。我尝试使用&lt;sup&gt;也代替开始和结束标签。但随后它们被呈现为<sup>HTML,而不是实际使其成为上标。请让我知道这个问题的解决方案。我可以控制 XML 的生成。如果我知道存储上标的正确方法是什么,我可以用正确的方式编写它。

4

3 回答 3

2

由于您使用 XSL 将输入转换为 HTML,因此我建议使用不同的方法来编码某些东西需要上标的事实。制作自己的简单标记,例如

<node name="Some text [[®]]"/>

标记可以是您以后可以唯一标识的任何内容,并且不会自然地出现在您的数据中。然后在您的 XSL 过程中,可以使用自定义模板包含此标记的属性值,该模板将特殊标记转换为<sup></sup>。这允许您保持文档结构(即不将这些字符串值移动到文本节点)并仍然实现您的目标。

于 2013-01-03T06:01:26.583 回答
1

请让我知道这个问题的解决方案。我可以控制 XML 的生成。如果我知道存储上标的正确方法是什么,我可以用正确的方式编写它。

因为属性只能包含值(没有节点),所以解决方案是在元素内存储标记(节点)

<node>
 <name>Some text <sup>®</sup></name>
</node>
于 2013-01-03T04:35:33.663 回答
0

如果只有像 ® 这样的单个字符需要制作上标,那么您可以让 XML 没有骗子 like <sup>,即 like

<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属性。如果您的应用程序对性能至关重要,那么最好做一些测试对处理时间的影响是否合理。

于 2013-01-03T07:09:54.080 回答