xslt 属性 (xsl-fo) 中的连字符

hyphenation character in xslt attribute (xsl-fo)

我认为这是一个非常简单的问题。但是虽然我建的很花哨的xslt转换,但是这么简单的一个我都解决不了

问题是: 我想根据 xml 数据向 xsl-fo 节点添加属性。这些属性通常有一个连字符。如何使用 xslt 转换添加这些 xsl:attributes 不喜欢连字符。


在 xml 节点中我有两个属性(名称和值) 示例:name="font_size", value="7pt"

<Report>
  <text content="I am a text">
    <blockFormat name="font_size" value="7pt" />
  </text>
</Report>

(我知道这是不需要的,因为您想使用样式等。这只是一个简化问题的示例)


现在我想制作一个 xsl-fo 块,我想使用 xsl-function xsl:attribute

将属性放在块元素中
<fo:block>
  <attribute name="{replace(@name,'_','-')}" select="@value" />
....
</fo:block>

改造后的目标

<fo:block font-size="7pt">
....
</fo:block

它不起作用,我认为这是因为在 xslt 中我不能在属性名称中放置连字符,但在 fo 属性中需要它。

有没有办法为此使用 xsl:attribute 函数?

如果不是,您建议采用哪种变通方法。

感谢您的帮助!!!

使用@select代替@value:

<fo:block>
  <attribute name="{replace(@name,'_','-')}" select="@value" />
....
</fo:block>

https://www.w3.org/TR/xslt20/#creating-attributes

此外,您需要使用 XSLT 2.0 或 3.0 才能使用 @select。如果您使用的是 XSLT 1.0,则必须按照 xsl:attribute/xsl:value-of/@select.

的方式进行操作

(如果您还显示了您得到的错误结果,这也有助于理解您的问题。)

有 1000 种方法,这里是一种(我没有对您的 Report 元素做任何事情):

输入:

<Report>
    <text content="I am a text">
        <blockFormat name="font_size" value="7pt" />
    </text>
</Report>

XSL:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:fo="http://www.w3.org/1999/XSL/Format"
    version="1.0">
    <xsl:template match="Report">
        <xsl:copy>
            <xsl:apply-templates/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="text">
        <fo:block>
            <xsl:apply-templates select="blockFormat/@*"/>
            <xsl:value-of select="@content"/>
        </fo:block>
    </xsl:template>
    <xsl:template match="@name">
        <xsl:attribute name="{translate(.,'_','-')}">
            <xsl:value-of select="ancestor::blockFormat/@value"/>
        </xsl:attribute>
    </xsl:template>
    <xsl:template match="@value"/>
</xsl:stylesheet>

输出:

<Report>
   <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format" font-size="7pt">I am a text</fo:block>
</Report>