2016-04-20 36 views
0

我认为这是一个非常简单的问题。但是,尽管我构建了非常花哨的xslt转换,但这个简单的转换不能由我来解决。xslt属性中的连字符(xsl-fo)

问题是: 我想添加属性到xsl-fo节点,这取决于xml数据。这些属性常常有一个连字符。我如何用xslt转换添加这些变量,其中xsl:属性不喜欢连字符。


在我有两个属性(名称和值) 例一个XML节点:名字= “FONT_SIZE”,值= “7PT”

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

(我明白这是不是因为想你想与风格etceters工作。这只是一个简单的问题


现在我想打一个XSL-FO块,我想地方的例子),通过USI块元素属性纳克的XSL功能的xsl:属性

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

目标改造后达到

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

它不工作,我想这是因为在XSLT我不能把一个连字符在属性名称中,但在fo-attribute中是需要的。

有没有办法使用xsl:属性函数呢?

如果不是,你建议什么样的工作。

谢谢你的帮助!

+1

“*我想这是因为在xslt我不能在属性名称中加一个连字符*”当然可以。这个失败究竟如何?你有错误信息吗?你确定你在使用XSLT 2.0处理器吗? –

回答

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

太棒了,确实太简单了。我没有使用翻译功能,这给我带来了麻烦。现在我可以轻松应对了! –

0

使用@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

(这也将帮助你的问题的了解,如果你想也显示错误的结果,你都拿到。)

+0

对不起,我在输入问题时犯了一个错误。我使用'选择'。你无法知道。问题是我没有得到错误的输出,但在转换时出现故障。也许它只是在xsl-fo处理步骤中。我看不到那么快。我会尽力找出答案。 –

+0

'