使用带有新行的 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,' ')" />
</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
【问题讨论】:
您是否尝试过<xsl:text>&#10;</xsl:text>
,如您链接到的示例中的那样?
代码应该没问题。为了解决这个问题,我们需要更多地了解您是如何运行它的:什么 XSLT 处理器、什么环境、什么 API。
虽然您的问题可能是拼写错误,但请记住 XSLT 区分大小写。您的 XML 中有 Recordset
元素(注意小的 s
),但正在 XSLT 中寻找 RecordSet
元素。
@PM77-1,是的,我试过了。如果我把它放在两个<xsl:value-of select="Line" />
之间,它会起作用,但这会重复数据。
@TimC :感谢您了解这一点。我修复了它,但它仍然没有工作。我认为 XSLT 不区分大小写。我是新手,所以不太了解
【参考方案1】:
有用的是用&#10;
替换换行变量
<xsl:variable name="newline"><xsl:text> </xsl:text></xsl:variable>
因此替换
<xsl:value-of select="concat(Line,' ')" />
与
<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】:
找到了解决办法。循环遍历<Recordset>
下的每个<Line>
节点并选择文本。
有效的 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> </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 转换为纯文本?