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

时间:2016-04-20 09:16:29

标签: xslt attributes special-characters xsl-fo hyphen

我认为这是一个非常简单的问题。但是虽然我构建了非常奇特的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>

(我知道这不是因为你想要使用样式etceters。它只是一个简化问题的例子)

现在我想创建一个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函数?

如果没有,你建议做什么工作。

感谢您的帮助!!!!

2 个答案:

答案 0 :(得分:0)

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

@select

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

此外,您需要使用XSLT 2.0或3.0才能使用xsl:attribute/xsl:value-of/@select。如果您使用的是XSLT 1.0,则必须将其作为{{1}}。

(如果您还显示了错误的结果,也可以帮助理解您的问题。)

答案 1 :(得分:0)

有1000种方法可以做到这一点,这里有一个(我没有对你的报告元素做任何事情):

输入:

<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>