【发布时间】:2013-06-29 10:49:51
【问题描述】:
我需要一些 XSLT(或 something - 见下文)将所有属性中的换行符替换为替代字符。
我必须处理将所有数据存储为属性的遗留 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。
【问题讨论】:
-
我有一种非常讨厌的感觉,我可能需要戴上橡胶手套并在解析之前在 XML 字符串上实现一个肮脏的正则表达式。不幸的是,我无法控制正在生成的 XML。
-
实际上不,这太可怕了,无法考虑。
-
如果属性值中的空格在语义上很重要,那么您就不是在处理 XML,您需要使用非 XML 工具来处理它。 Per spec 属性值中的所有换行符必须由解析器转换为空格,如果您希望解析后看到的值中有换行符,则必须将其作为字符引用转义(
&#10;) -
我不同意你的观点。 XML 是从将保持无名的应用程序中导出的。这不是完全应用程序的错,尽管在属性中填充所有数据可能是一种有点可疑的方法。我怀疑用户通过使用应用程序盲目地将其原封不动地导出到 XML 的换行符来解决此特定字段缺乏 1:M 基数的问题。
-
我可能会对任何为可疑 XML 设计的 Java 库进行一些研究——这不可能是一个孤立的实例,所以我确信那里有人编写了一个故意松散/宽容的解析器。