为xml中的每个xsl:text标记设置disable-output-escaping =“yes”

时间:2013-01-08 14:42:36

标签: xslt text escaping output

说我有以下xml:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/*">
  <display>
    <xsl:for-each select="logline_t">
      <xsl:text disable-output-escaping="yes">&lt;</xsl:text> <xsl:value-of select="./line_1" <xsl:text disable-output-escaping="yes">&gt;</xsl:text>
      <xsl:text disable-output-escaping="yes">&lt;</xsl:text> <xsl:value-of select="./line_2" <xsl:text disable-output-escaping="yes">&gt;</xsl:text>
      <xsl:text disable-output-escaping="yes">&lt;</xsl:text> <xsl:value-of select="./line_3" <xsl:text disable-output-escaping="yes">&gt;</xsl:text>
    </xsl:for-each>
  </display>
</xsl:template>
</xsl:stylesheet>

有没有办法为文档中出现的所有xsl:text设置disable-output-escaping =“yes”?

我知道可以选择  &LT; xsl:output method =“text”/&gt; 每次都喜欢     &安培; LT; 出现,&lt;会出现,但问题是有时在line_1,line_2或line_3的值中,有一个“$ lt;”我不想改变(这是,我只需要改变之间的任何东西)

这就是我想要完成的事情。我有这个xml:

<readlog_l>
 <logline_t>
  <hora>16:01:09</hora>
  <texto>Call-ID: 663903&lt;hola&gt;396@127.0.0.1</texto>
 </logline_t>
</readlog_l>

这个翻译:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/*">
 <display>

  &lt;screen name="<xsl:value-of select="name(.)"/>"&gt;

  <xsl:for-each select="logline_t">
  &lt; field name="<xsl:for-each select="*"><xsl:value-of select="."/></xsl:for-each>" value="" type="label"/&gt;
  </xsl:for-each>

  &lt;/screen&gt;

 </display>
</xsl:template>

</xsl:stylesheet>

我希望这是输出:

<?xml version="1.0"?>
<display>

<screen name="readlog_l">

  <field name="16:01:09 Call-ID: 663903&lt;hola&gt;396@127.0.0.1 " value="" type="label">

</screen>
</display>

请注意,我需要“&lt;”在字段名称里面没有被转义,这就是为什么我不能使用输出方法文本。

另外,请注意这是一个示例,并且翻译要大得多,所以这就是为什么我要弄清楚如何不为每个'&lt;'编写disable-output-escaping或'&gt;'我需要。

谢谢!

3 个答案:

答案 0 :(得分:2)

感谢您澄清问题。在这种情况下,我很确定没有必要禁用输出转义。 XSLT旨在完成您正在做的事情:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/*">
 <display>

  <screen name="{name(.)}">

  <xsl:for-each select="logline_t">
     <xsl:variable name="nameContent">
        <xsl:for-each select="*">
          <xsl:if test="position() > 1"><xsl:text> </xsl:text></xsl:if>                 
          <xsl:value-of select="."/>
        </xsl:for-each>
     </xsl:variable>
     <field name="{$nameContent}" value="" type="label" />
  </xsl:for-each>

  </screen>

 </display>
</xsl:template>

</xsl:stylesheet>

我在这一点上有点不清楚: 请注意,我需要“&lt;”在字段名称里面没有被转义,这就是为什么我不能使用输出方法文本。

哪个&lt;你指的是什么?它是&lt;和&gt;围绕“hola”?如果您将那些未转义的内容留下,您最终会得到无效的XML。它看起来像示例输出中的name属性有很多不在输入XML中的值。那些人来自哪里?

答案 1 :(得分:2)

鉴于您的预期输出,您根本不需要d-o-e。这是一个不使用d-o-e的可能解决方案,它基于模板而不是for-each

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" />

  <xsl:template match="/*">
    <display>
      <screen name="{name(.)}">
        <xsl:apply-templates select="logline_t"/>
      </screen>
    </display>
  </xsl:template>

  <xsl:template match="logline_t">
    <field value="" type="label">
      <xsl:attribute name="name">
        <xsl:apply-templates select="*" mode="fieldvalue"/>
      </xsl:attribute>
    </field>
  </xsl:template>

  <xsl:template match="*[last()]" mode="fieldvalue">
    <xsl:value-of select="." />
  </xsl:template>

  <xsl:template match="*" mode="fieldvalue">
    <xsl:value-of select="." />
    <xsl:text> </xsl:text>
  </xsl:template>

</xsl:stylesheet>

答案 2 :(得分:1)

如果你想在所有东西上设置d-o-e,那表明你正试图“手动”生成标记。我不认为这是一个特别好的想法(事实上,我认为这是一个糟糕的想法),但如果这是你想要做的,我建议使用文本输出方法而不是xml输出方法。这样,就不会发生特殊字符的转义,因此不需要禁用它。