【问题标题】:Cannot insert line break in attribute value via XSLT无法通过 XSLT 在属性值中插入换行符
【发布时间】:2020-12-17 22:33:36
【问题描述】:

我是 XSLT 的新手,我很难在两个句子之间插入换行符。我知道论坛中有人问过类似的问题,但没有一个解决方案对我有用,如果我违反了任何社区规则,我很抱歉。

所以基本上我有这样的东西:

<xsl:attribute name="messageText">
<xsl:value-of select="eligInformation/@messageText02"/>
<br />
<xsl:value-of select="eligInformation/@messageText03"/>
</xsl:attribute>    

&lt;br /&gt; 或其任何变体(&lt;br/&gt;, &lt;br&gt;&lt;/br&gt; 等)不起作用,.NET 解析器似乎不喜欢它,并引发以下错误:“'元素'类型的项目不能在“属性”类型的节点内构造”。

我也尝试过各种替代方案,例如:

<xsl:text>&#xa;</xsl:text>
<xsl:text>&#10;</xsl:text>
<xsl:text>

</xsl:text>

等等,但在这些情况下,即使我没有收到任何错误,两条消息也只是出现在同一行中。

【问题讨论】:

    标签: xml xslt line-breaks eol


    【解决方案1】:

    xsl:attribute用于设置属性值。

    &lt;br/&gt;是一个HTML元素,属性值中不允许有元素,所以你报错了。

    虽然在 XML 属性中允许使用换行符,但此类设计或计划可能会由于对 3.3.3 Attribute-Value Normalization 的不当、不一致甚至正确解释而搁浅:

    3.3.3 属性值归一化

    在将属性的值传递给应用程序之前或 检查有效性,XML 处理器必须规范化属性 通过应用下面的算法或使用其他方法来获得价值 这样传递给应用程序的值与 算法产生的。

    1. 所有换行符必须在输入到 #xA 时被标准化为 在2.11 End-of-Line Handling 中描述,所以剩下的 算法对以这种方式规范化的文本进行操作。

    2. 从一个由空字符串组成的规范化值开始。

    3. 对于每个字符、实体引用或字符引用 非规范化的属性值,从第一个和 继续到最后,执行以下操作:

      • 对于字符引用,将引用的字符附加到规范化值。

      • 对于实体引用,递归地将此算法的第 3 步应用于实体的替换文本。

      • 对于空格字符(#x20#xD#xA#x9),将空格字符 (#x20) 附加到标准化值。

    对于另一个字符,将该字符附加到标准化值。

    建议:避免在 XML 属性值中换行。

    另见

    【讨论】:

    • 谢谢@kjhughes,我认为这说明了为什么我无法添加换行符。而且由于我已经尝试了链接中的所有内容,我想是时候寻找改变设计了。
    【解决方案2】:

    不清楚如何将 XSLT 与 .NET 一起使用,但如果将字符引用放在属性值中,那么它应该被序列化,例如在 https://xsltfiddle.liberty-development.net/nb9PtDz XML 中

    <root>
        <item info1="Line 1." info2="Line 2."/>
    </root>
    

    被转化为

    <xsl:stylesheet
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        version="1.0">
    
      <xsl:template match="@* | node()">
        <xsl:copy>
          <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
      </xsl:template>
    
      <xsl:template match="item">
          <item infos="{@info1}&#10;{@info2}"/>
      </xsl:template>
    
    </xsl:stylesheet>
    

    在结果中使用 .NET 的 XslCompiledTransform

    <root>
        <item infos="Line 1.&#xA;Line 2." />
    </root>
    

    所以 LF 就在那里,它必须作为字符引用进行转义,否则任何 XML 解析器解析结果都会将正常的 LF 转换为属性规范化的空格。

    【讨论】:

    • 谢谢马丁霍南。正如@kjhughes 所指出的,似乎我无法将此解决方案适应我的代码,其中包括属性,我认为这是主要问题。如果我设法让它工作,我会更新你。
    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 2015-12-19
    • 1970-01-01
    • 2013-06-29
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 2013-11-26
    相关资源
    最近更新 更多