XSLT:XML 节点呈现问题

Posted

技术标签:

【中文标题】XSLT:XML 节点呈现问题【英文标题】:XSLT: XML node rendering issue 【发布时间】:2021-08-31 19:33:38 【问题描述】:

我正在尝试使用 XSLT 呈现示例 XML,如下所示:

<?xml version="1.0" encoding="UTF-16"?>
<root>
<title>test</title>
<description> This is the first description</description>
<description>This is for
      <subject>testing</subject>every day
</description> 
</root>

我正在使用以下 XSLT 代码来显示描述节点。

<xsl:for-each select="root/description">
<p><xsl:value-of select="."/></p>
</xsl:for-each>`

这是我得到的输出。

This is the first description
    
This is for testing every day

您能否建议一下,为什么它在第二个描述节点中显示 testing

testing 在主题节点下。由于格式化,我想使用&lt;xsl:value-of select="subject"/&gt;代码获取主题节点。

您能否提出解决方案?

非常感谢。

问候,AK

【问题讨论】:

请不要重复发布相同的问题:***.com/questions/67950714/… 好的,谢谢您的指出。它是错误发生的。我很抱歉。 【参考方案1】:

在 XSLT-1.0 中,表达式&lt;xsl:value-of select="."/&gt; 选择所有后代 节点的text() 值并将它们连接起来。要仅选择所有直接子级,您必须像这样应用另一个 for-each:

<xsl:for-each select="root/description">
  <p>
    <xsl:for-each select="text()">   <!- Select all direct text() children -->
      <xsl:value-of select="normalize-space(.)"/><xsl:text> </xsl:text>    
    </xsl:for-each>
  </p>
</xsl:for-each>

然后,输出将如下:

<p>This is the first description </p>
<p>This is for every day </p>

编辑(附加要求):

您可以将text() 节点与特定的父元素匹配:

<xsl:template match="/">
    <xsl:for-each select="root/description">
      <p><xsl:apply-templates select="node()|@*" /></p>
   </xsl:for-each>
</xsl:template>
  
<xsl:template match="text()">
    <xsl:value-of select="normalize-space(.)"/><xsl:text> </xsl:text>    
</xsl:template>

<xsl:template match="subject/text()">
    <b><xsl:value-of select="normalize-space(.)"/></b>
</xsl:template>

输出是:

<p>This is the first description </p>
<p>
    This is for <b>testing</b>
every day </p>

这种方法可以在输出中添加高亮元素。但我不知道如何摆脱多余的空间,所以这(也许)已经很好了。

【讨论】:

非常感谢。我有一个澄清。如果我想通过将描述分成“这是为了”和“每天”来显示“这是为了每天测试”这样的描述,然后在两个短语之间插入格式化的“测试”?我该怎么做?任何建议表示赞赏。 非常感谢。 “” 代码有什么作用? 如果可能,您能否分享您对这篇文章的见解? ***.com/questions/68013032/… 这是一个不同的问题。我回答了您的问题,并对其进行了后续扩展。请单击左侧的箭头将此答案标记为“已接受”。这是 *** 上的预期行为。 非常感谢。这是工作。我非常感谢您的支持。我看不到接受答案的选项。另外,我并不是要在这里获得另一篇帖子的答案,只是想分享一下,如果您有兴趣查看我的另一篇帖子,并可能在该帖子上分享任何见解。再次感谢您的支持和时间。【参考方案2】:

xsl:value-of 只能创建字符串。如果您希望在输出中包含subject 元素,请使用xsl:copy-of 而不是xsl:value-of

【讨论】:

非常感谢。我有一个澄清。如果我想通过将描述分解为“这是用于”和“每天”来显示“这是用于每天测试”的描述,然后在两个短语之间插入格式化的“测试”?我该怎么做?任何建议表示赞赏。

以上是关于XSLT:XML 节点呈现问题的主要内容,如果未能解决你的问题,请参考以下文章

XSLT - 如何将节点内的内联/转义 XML 视为嵌套节点

使用 xslt 将 xml 复杂节点元素拆分为多个节点

XSLT:在重新排列 XML 时面临多个父节点的问题

使用 XSLT 将 XML 节点组合成单个节点

使用 XSLT 删除 XML 节点文本

XSLT 1.0 按子节点的值对 xml 节点进行分组