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>
我认为这是一个非常简单的问题。但是虽然我建的很花哨的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>