使用带有新行的 XSLT 将 XML 转换为文本

Posted

技术标签:

【中文标题】使用带有新行的 XSLT 将 XML 转换为文本【英文标题】:XML to Text transform using XSLT with new line 【发布时间】:2016-06-17 12:20:31 【问题描述】:

我查看了多个示例并尝试了每个示例。不知道我错过了什么。我发现与其他示例的唯一区别是我在<RecordSet> 下有多个<Line> 节点。

XML:

<?xml version="1.0" encoding="utf-8"?>
<urn:FlatStructure">
  <Recordset>
    <Line> 12345678</Line>
    <Line> abcdefgh</Line>
  </Recordset>
</urn:FlatStructure>

XSLT:

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

<!-- First Trial  -->

<xsl:variable name="newline"><xsl:text>
</xsl:text></xsl:variable>

<xsl:template match="/urn:FlatStructure/RecordSet">
   <xsl:value-of select="concat(Line,$newline)" />
</xsl:template> 

<!-- Second Trial  -->
<xsl:template match="/urn:FlatStructure">
  <xsl:apply-templates select="RecordSet/Line" />
</xsl:template>

<!-- Third Trial  -->
<xsl:template match="/urn:FlatStructure">
<xsl:value-of select="concat(Line,'&#10;')" />
</xsl:template>

</xsl:stylesheet>

当前文本输出:

12345678 abcdefgh

所需的文本输出:

12345678
abcdefgh

我在 XSLT 中缺少什么?请让我知道我该如何纠正它。

谢谢

我查看了以下示例(有些可能是重复的),但没有一个对我有用:

XSLT to convert XML to text

Producing a new line in XSLT

how to add line breaks at the end of an xslt output?

not adding new line in my XSLT

【问题讨论】:

您是否尝试过&lt;xsl:text&gt;&amp;#10;&lt;/xsl:text&gt;,如您链接到的示例中的那样? 代码应该没问题。为了解决这个问题,我们需要更多地了解您是如何运行它的:什么 XSLT 处理器、什么环境、什么 API。 虽然您的问题可能是拼写错误,但请记住 XSLT 区分大小写。您的 XML 中有 Recordset 元素(注意小的 s),但正在 XSLT 中寻找 RecordSet 元素。 @PM77-1,是的,我试过了。如果我把它放在两个&lt;xsl:value-of select="Line" /&gt; 之间,它会起作用,但这会重复数据。 @TimC :感谢您了解这一点。我修复了它,但它仍然没有工作。我认为 XSLT 不区分大小写。我是新手,所以不太了解 【参考方案1】:

有用的是用&amp;#10; 替换换行变量

<xsl:variable name="newline"><xsl:text>&#10;</xsl:text></xsl:variable>

因此替换

<xsl:value-of select="concat(Line,'&#10;')" />

<xsl:value-of select="concat(Line,$newline)" />

这给出了想要的结果。

但是,您的代码有一些命名空间问题需要解决... 因此,将 urn: 命名空间添加到您的 XML

<urn:FlatStructure xmlns:urn="http://some.urn">

和这样的 XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:urn="http://some.urn">

然后,从 XSLT 模板中的 FlatStructure 匹配项中删除 urn 前缀。

【讨论】:

谢谢,我试过了。忘了在最初的问题中提及它。 我确实有一个 URN。但是,由于它是专有信息,因此我没有包含它。 xmlns:urn 是否影响 XSLT 转换 XML 的方式? @user6015642:是的。它确实会影响匹配的节点。我必须添加一个命名空间才能使您的示例工作。【参考方案2】:

找到了解决办法。循环遍历&lt;Recordset&gt; 下的每个&lt;Line&gt; 节点并选择文本。

有效的 XSLT:

<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:urn="someurn">

<xsl:output method="text" />

<xsl:template match="/urn:FlatStructure/Recordset">
    <xsl:for-each select="Line">
        <xsl:value-of select="text()"/>
        <xsl:text>&#10;</xsl:text>
    </xsl:for-each>
 </xsl:template>

</xsl:stylesheet>

多个具有相同名称的子节点似乎是问题所在。

感谢大家的参与。

干杯!

【讨论】:

以上是关于使用带有新行的 XSLT 将 XML 转换为文本的主要内容,如果未能解决你的问题,请参考以下文章

XSLT:如何使用 Muenchian 分组将 XML 转换为文本文件

使用 XSLT 将 XML 转换为带有嵌套 AND/OR 的“布尔”英文句子

XSLT 使用 xslt 2.0 或更高版本将纯文本文件处理为 XML

是否有任何现成的 xslt 文件可以将 ODF 内容 xml 转换为纯文本?

Adobe LiveCycle:使用 XSLT 将 XML 转换为 XML

XSLT 将嵌套的 xml 元素写为一个带有逗号分隔值字符串的元素