我在处理XML文件时使用<xsl:message terminate="yes">
输出错误。这工作正常,但是当我试图期望RSpec中的错误时,我遇到它显然在xsl:message的末尾添加换行符这一事实。我不想在测试中添加一个奇怪的换行符,我更喜欢从xsl:message中删除换行符。
XML:
<prog Id="fooid"></prog>
XSLT:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="prog">
<xsl:apply-templates select="." mode="second-pass"/>
</xsl:template>
<xsl:template match="prog" mode="second-pass">
<xsl:message terminate="yes"><xsl:value-of select="@Id"/> was dropped</xsl:message></xsl:template>
在我的测试代码中:
it 'raises an error when an item matches no other templates' do
expect{item_from_xml('<prog Id="fooid">')}.to raise_error(RuntimeError.new('fooid was dropped'))
end
但输出是:
Failure/Error: expect{item_from_xml('<prog Id="fooid">')}.to raise_error(RuntimeError.new('fooid was dropped'))
expected #<RuntimeError: fooid was dropped>, got #<RuntimeError: fooid was dropped
> with backtrace:
你可以在最后看到额外的换行符。
item_from_xml的代码如下:
def item_from_xml(xml, params=['country', "'US'"])
xslt = Nokogiri::XSLT(File.read(XSL FILE HERE))
xslt.transform(Nokogiri::XML(xml), params)
end
我试图在<value-of select
字段中规范化空间,但这并没有做太多,因为它只影响了@Id。我试过了:
<xsl:template match="prog" mode="second-pass">
<xsl:message terminate="yes"><xsl:value-of select="normalize-space(concat(@Id, ' ', 'was dropped'))"/></xsl:message></xsl:template>
但是这导致了完全相同的输出。我试过了:
<xsl:template match="prog" mode="second-pass">
<xsl:message terminate="yes"><xsl:value-of select="@Id"/><xsl:text> was dropped</xsl:text></xsl:message></xsl:template>
再次没有运气。我不想从整个文件中删除尾随的新行,只是在我使用终止消息的情况下。我觉得我可能有些愚蠢的东西,但是我对XSLT很新,我似乎无法得到这个。