我认为这是一个非常简单的问题。但是虽然我构建了非常奇特的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函数?
如果没有,你建议做什么工作。
感谢您的帮助!!!!
答案 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>