XML 到使用 XSLT 换行的文本转换

XML to Text transform using XSLT with new line

我查看了多个示例并逐一尝试。不知道我错过了什么。我发现与其他示例的唯一区别是我在 <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 中缺少什么?请让我知道如何更正它。

谢谢

我查看了以下示例(有些可能重复),但其中 none 对我有用:

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

有帮助的是用 &#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 前缀。

找到解决方案。遍历 <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>&#10;</xsl:text>
    </xsl:for-each>
 </xsl:template>

</xsl:stylesheet>

似乎是多个子节点同名的问题。

感谢大家的参与。

干杯!