XSLT 1. :: 处理编码字符串以获得 child 注释
XSLT 1. :: Processing encoded string to get child notes
看来我正在努力实现无法实现的目标,但它是:
我有一个 XML 结构,如:
<?xml version="1.0" encoding="UTF-8"?>
<article>
<h1><p mystyle="texte"><b>Barème</b> sur 20 points</p></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>
我试图接触孩子的任何尝试都失败了。
- 将未转义的字符串设置为变量并处理该变量
<?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>
- 尝试将 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>
我一直在读到 disable-output-escaping 的限制之一是无法处理“节点”。
是这样吗?
提前感谢您的任何提示。
如果您仅限于 XSLT 1.0,则必须分两次进行转换:首先,在 h1
上禁用输出转义并将结果保存到文件中;然后使用另一个样式表将结果文件处理为“正常”XML。
或者,您可以尝试使用文本函数从转义字符串中解析出信息,并在禁用转义的情况下输出结果 - 例如:
<xsl:template match="h1">
<xsl:copy>
<xsl:value-of select="substring-before(substring-after(., '>'), '</p>')" disable-output-escaping="yes"/>
</xsl:copy>
</xsl:template>
但是如果您的输入不遵循与示例相同的结构,这可能很容易失败。当然,结果是一个字符串,只能按原样输出;在同一个样式表中不可能进行进一步的处理,文本函数除外。
看来我正在努力实现无法实现的目标,但它是: 我有一个 XML 结构,如:
<?xml version="1.0" encoding="UTF-8"?>
<article>
<h1><p mystyle="texte"><b>Barème</b> sur 20 points</p></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>
我试图接触孩子的任何尝试都失败了。
- 将未转义的字符串设置为变量并处理该变量
<?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>
- 尝试将 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>
我一直在读到 disable-output-escaping 的限制之一是无法处理“节点”。 是这样吗?
提前感谢您的任何提示。
如果您仅限于 XSLT 1.0,则必须分两次进行转换:首先,在 h1
上禁用输出转义并将结果保存到文件中;然后使用另一个样式表将结果文件处理为“正常”XML。
或者,您可以尝试使用文本函数从转义字符串中解析出信息,并在禁用转义的情况下输出结果 - 例如:
<xsl:template match="h1">
<xsl:copy>
<xsl:value-of select="substring-before(substring-after(., '>'), '</p>')" disable-output-escaping="yes"/>
</xsl:copy>
</xsl:template>
但是如果您的输入不遵循与示例相同的结构,这可能很容易失败。当然,结果是一个字符串,只能按原样输出;在同一个样式表中不可能进行进一步的处理,文本函数除外。