XSLT 1. :: 处理编码字符串以获取子注释

看来我正在努力实现无法实现的目标,但它是: 我有一个 XML 结构,如:

<?xml version="1.0" encoding="UTF-8"?>
<article>
       <h1>&lt;p mystyle=&quot;texte&quot;&gt;&lt;b&gt;Barème&lt;/b&gt; sur 20 points&lt;/p&gt;</h1>
</article>

如果我调用 value-of 和 disable-output-escaping="yes",我会得到一个格式很好的结构:

<?xml version="1.0" encoding="UTF-8"?>
<article>
<h1>
    <p mystyle="texte"><b>Barème</b> sur 20 points</p>
</h1>
</article>

问题是我只想得到 p 标签的孩子:

<?xml version="1.0" encoding="UTF-8"?>
<article>
<h1>
    <b>Barème</b> sur 20 points
</h1>
</article>

我接触孩子的任何尝试都失败了。

  1. 将未转义的字符串设置为变量并处理该变量

<?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="1.0" >
    <xsl:template match="/">
      <xsl:apply-templates select="*"></xsl:apply-templates>
    </xsl:template>
    <xsl:template match="h1">
        <xsl:variable name="unescaped">
            <xsl:value-of select="." disable-output-escaping="yes"/>    
        </xsl:variable>
        <xsl:value-of select="$unescaped/*"/>
    </xsl:template>
    </xsl:stylesheet>

  1. 尝试将 xpath 设置为 ./*(空结果)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="1.0" >
    
    <xsl:template match="/">
      <xsl:apply-templates select="*"></xsl:apply-templates>
    </xsl:template>
    
    <xsl:template match="h1">
        <xsl:value-of select="./*" disable-output-escaping="yes"/>
    </xsl:template>
    
</xsl:stylesheet>

我一直在读到禁用输出转义的限制之一是无法处理“节点”。 是这样吗?

提前感谢您的任何提示。

lytaianly 回答:XSLT 1. :: 处理编码字符串以获取子注释

如果您仅限于 XSLT 1.0,则必须分两遍进行转换:首先,禁用 h1 上的输出转义并将结果保存到文件中;然后使用另一个样式表将生成的文件作为“普通”XML 处理。

或者,您可以尝试使用文本函数从转义字符串中解析出信息,并在禁用转义的情况下输出结果 - 类似于:

<xsl:template match="h1">
    <xsl:copy>
        <xsl:value-of select="substring-before(substring-after(.,'>'),'&lt;/p>')" disable-output-escaping="yes"/>
    </xsl:copy>
</xsl:template>

但是如果您的输入与您的示例不遵循相同的结构,这可能很容易失败。当然,结果是一个字符串,只能按原样输出;除了文本函数外,在同一个样式表中不可能有进一步的处理。

本文链接:https://www.f2er.com/49583.html

大家都在问