2012-06-21 52 views
1

我尝试本地化Web应用程序中的XSLT模板,并且我想使用实体机制来实现此目的。但是结果文档中的值不会被替换。Nokogiri忽略XSL转换中的实体

Ruby脚本

require 'nokogiri' 

doc = Nokogiri::XML(File.read('test.xml')) 
xslt = Nokogiri::XSLT(File.read('test.xsl')) 

puts xslt.transform(doc) 

XML文档

<?xml version="1.0" encoding="UTF-8" ?> 

<CommonCard> 
    <Test/> 
</CommonCard> 

XSLT样式表

<?xml version="1.0" encoding="UTF-8"?> 

<!DOCTYPE xsl:stylesheet [ 
    <!ENTITY labelHello "hello world!"> 
]> 

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output encoding="utf-8" method="xml" /> 

    <xsl:template match="/"> 
    &labelHello; 123 
    </xsl:template> 

</xsl:stylesheet> 

我想这

<?xml version="1.0" encoding="utf-8"?> 
hello world! 123 

但现在我得到这个

<?xml version="1.0" encoding="utf-8"?> 
123 

我在做什么错?

UPD

我用引入nokogiri XML引擎

+1

这里是一个可能的解释。请参阅最后一个答案:http://www.ruby-forum.com/topic/849565 – Casper

+0

这可能是供应商特定的解析器问题。什么是您的XSLT引擎? –

+0

@Sean B. Durkin - Nokogiri(http://nokogiri.org/) – andrykonchin

回答

1

我怀疑这只是一个引入nokogiri的限制。我建议一个解决方法:使用变量,而不是实体,像这样...

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:variable name="labelHello" select="'hello world!'" /> 
    <xsl:template match="/"> 
    <xsl:value-of select="$labelHello" /> 123 
    </xsl:template> 
</xsl:stylesheet>