我需要一些 XSLT(或某些东西 - 见下文)来用替代字符替换所有属性中的换行符。
我必须处理遗留的 XML,它将所有数据存储为属性,并使用换行符来表达基数。例如:
<sample>
<p att="John
Paul
Ringo"></p>
</sample>
当我在 Java 中解析文件(根据 XML 规范)时,这些换行符将被空格替换,但是我希望将它们视为列表,因此这种行为不是特别有用。
我的“解决方案”是使用 XSLT 将所有属性中的所有换行符替换为其他分隔符 - 但我对 XSLT 的了解为零。到目前为止我看到的所有示例要么非常具体,要么替换了节点内容而不是属性值。
我已经涉足 XSLT 2.0 的 replace()
,但很难将所有内容组合在一起。
XSLT 是正确的解决方案吗?使用下面的 XSLT:
<xsl:template match="sample/*">
<xsl:for-each select="@*">
<xsl:value-of select="replace(current(), '\n', '|')"/>
</xsl:for-each>
</xsl:template>
使用 Saxon 应用于示例 XML 输出以下内容:
John Paul Ringo
显然这种格式不是我想要的 - 这只是为了试验 replace()
- 但是当我们进行 XSLT 处理时,换行符是否已标准化?如果是这样,是否有其他方法可以使用 Java 解析器将这些值解析为令状?到目前为止我只使用过 JAXB。
最佳答案
这个好像很难做。正如我在Are line breaks in XML attribute values allowed?中发现的那样- 属性中的换行符有效,但 XML 解析器对其进行规范化 ( https://stackoverflow.com/a/8188290/1324394 ),因此它可能在处理之前(以及替换之前)丢失。
关于xml - 使用 XSLT 替换 XML 属性中的换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17419330/