如何在XML属性中存储上标并使用XSL读取?

时间:2013-01-03 04:04:11

标签: html xml xslt superscript

我需要动态创建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;代替打开和关闭标记。但是它们在HTML上呈现为<sup>而不是实际上是上标。 请让我知道这个问题的解决方案。我控制着XML的生成。我可以用正确的方式写它,如果我知道什么是存储上标的正确方法。

3 个答案:

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