假设我有以下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"><</xsl:text> <xsl:value-of select="./line_1" <xsl:text disable-output-escaping="yes">></xsl:text>
<xsl:text disable-output-escaping="yes"><</xsl:text> <xsl:value-of select="./line_2" <xsl:text disable-output-escaping="yes">></xsl:text>
<xsl:text disable-output-escaping="yes"><</xsl:text> <xsl:value-of select="./line_3" <xsl:text disable-output-escaping="yes">></xsl:text>
</xsl:for-each>
</display>
</xsl:template>
</xsl:stylesheet>有没有一种方法可以将文档中出现的所有xsl:text都设置为disable-output-escaping="yes“?
我知道有一个将< xsl:output method="text"/ >放入的选项,每次出现类似& lt;的内容时,都会出现一个<,但问题是,有时在line_1、line_2或line_3的值中,有一个我不希望更改的"$lt;“(即,我只需要更改之间的任何内容)
这就是我想要实现的目标。我有这个xml:
<readlog_l>
<logline_t>
<hora>16:01:09</hora>
<texto>Call-ID: 663903<hola>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>
<screen name="<xsl:value-of select="name(.)"/>">
<xsl:for-each select="logline_t">
< field name="<xsl:for-each select="*"><xsl:value-of select="."/></xsl:for-each>" value="" type="label"/>
</xsl:for-each>
</screen>
</display>
</xsl:template>
</xsl:stylesheet>我希望这是输出:
<?xml version="1.0"?>
<display>
<screen name="readlog_l">
<field name="16:01:09 Call-ID: 663903<hola>396@127.0.0.1 " value="" type="label">
</screen>
</display>请注意,我需要字段名中的"<“不被转义,这就是我不能使用输出方法文本的原因。
另外,请注意,这只是一个示例,并且转换更大,所以这就是为什么我要找出如何不为我需要的每个'<‘或'>’编写停用-输出-转义。
谢谢!
发布于 2013-01-09 01:27:36
谢谢你澄清了这个问题。在这种情况下,我非常确定没有必要禁用输出转义。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>这一点我有点不清楚:请注意,我需要字段名中的"<“不被转义,这就是我不能使用输出方法文本的原因。
您指的是哪个<?是不是"hola“周围的< and >?如果没有对它们进行转义,最终会得到无效的XML。看起来,样例输出中的name属性有很多值,这些值不在输入XML中。这些是从哪里来的?
发布于 2013-01-09 21:33:40
给定您的预期输出,您根本不需要使用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>发布于 2013-01-09 01:21:02
如果你想在所有东西上都设置d-o-e,这意味着你正试图“手动”生成标记。我不认为这是一个特别好的想法(实际上,我认为这是一个糟糕的想法),但是如果这是您想要做的,我建议使用文本输出方法而不是xml输出方法。这样,就不会发生特殊字符的转义,因此不需要禁用它。
https://stackoverflow.com/questions/14217412
复制相似问题