11

免责声明:以下是针对 XML 的一种罪过。这就是为什么我试图用 XSLT 来改变它:)

我的 XML 目前看起来像这样:

<root>
    <object name="blarg" property1="shablarg" property2="werg".../>
    <object name="yetanotherobject" .../>
</root>

是的,我将所有文本数据放入属性中。我希望 XSLT 可以拯救我;我想朝着这样的方向发展:

<root>
    <object>
        <name>blarg</name>
        <property1>shablarg</name>
        ...
    </object>
    <object>
        ...
    </object>
</root>

到目前为止,我实际上已经完成了所有这些工作,除了我对 XML 的罪过更加……特别。一些标签如下所示:

<object description = "This is the first line

This is the third line.  That second line full of whitespace is meaningful"/>

我在linux下使用xsltproc,但它似乎没有任何选项来保留空格。我尝试使用 xsl:preserve-space 和 xml:space="preserve" 无济于事。我发现的每个选项似乎都适用于在元素本身内保留空格,但不适用于属性。每次,上面的内容都会更改为:

这是第一行 这是第三行。充满空格的第二行是有意义的

所以问题是,我可以保留属性空白吗?

4

4 回答 4

6

这实际上是一个原始 XML 解析问题,不是 XSLT 可以帮助您解决的问题。根据 XML 标准中的“3.3.3 属性值规范化”,XML 解析必须将该属性值中的换行符转换为空格。因此,当前读取您的描述属性并保留换行符的任何内容都是错误的。

您可以通过预处理 XML 以将换行符转义为 & #10; 来恢复换行符。字符引用,只要您还没有在不允许使用 charrefs 的地方换行,例如在标签正文中。Charrefs 应该作为控制字符一直存在到属性值,然后您可以将它们转换为文本节点。

于 2008-11-04T00:42:37.487 回答
3

根据Annotated XML Spec,属性值中的空格由 XML 处理器规范化(参见 3.3.3 上的 (T) 注释)。所以,看起来答案可能是否定的。

于 2008-11-04T00:35:16.830 回答
1

正如其他人指出的那样,XML 规范不允许在属性中保留空格。事实上,这是属性和元素之间为数不多的区别之一(另一个主要区别是元素可以包含其他标签,而属性则不能)。

您必须首先在 XML 之外处理文件以保留空格。

于 2008-11-04T03:28:38.477 回答
0

如果您可以控制您的 XML 处理器,那么您就可以做到。

从我的其他答案(链接了许多参考资料):

如果您有类似的 XML

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE elemke [
<!ATTLIST brush wood CDATA #REQUIRED>
]>

<elemke>
<brush wood="guy&#xA;threep"/>
</elemke>

和一个像 XSL

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet  version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template name="split">
  <xsl:param name="list"      select="''" />
  <xsl:param name="separator" select="'&#xA;'" />
  <xsl:if test="not($list = '' or $separator = '')">
    <xsl:variable name="head" select="substring-before(concat($list, $separator), $separator)" />
    <xsl:variable name="tail" select="substring-after($list, $separator)" />

    <xsl:value-of select="$head"/>
    <br/><xsl:text>&#xA;</xsl:text>
    <xsl:call-template name="split">
        <xsl:with-param name="list"      select="$tail" />
        <xsl:with-param name="separator" select="$separator" />
    </xsl:call-template>
  </xsl:if>
</xsl:template>


<xsl:template match="brush">
  <html>
  <xsl:call-template name="split">
    <xsl:with-param name="list" select="@wood"/>
  </xsl:call-template>
  </html>
</xsl:template>

</xsl:stylesheet>

你可以得到一个像这样的html:

<html>guy<br>
   threep<br>

</html>  

使用像这个撒克逊命令行这样的处理器测试/生产:

java -jar saxon9he.jar -s:in.xml -xsl:in.xsl -o:out.html
于 2015-04-21T20:19:28.547 回答