Railsアプリがあり、Bundlerを使用してgemを管理しています。XSLT変換にはruby-xsltgemを使用します。gemはnode-set()のようなexslt機能を認識していません。
これが私がテストしてきたスタイルシートです
<xsl:stylesheet version="1.1"
xmlns="http://max.gov"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:pre="http://max.gov"
xmlns:exslt="http://exslt.org/common">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<!--The fabricated xml I want to access with exslt:node-set()-->
<xsl:variable name="PRE">
<root>
<item/>
<item/>
</root>
</xsl:variable>
<xsl:template match="/">
<results>
<run1 name="exslt:node-set($PRE)//pre:item">
<results>
<xsl:for-each select="exslt:node-set($PRE)//pre:item">
<success position="{position()}"/>
</xsl:for-each>
</results>
</run1>
<run2 name="exslt:node-set($PRE)//pre:item">
<results>
<xsl:for-each select="exslt:node-set($PRE)//pre:item">
<success position="{position()}"/>
</xsl:for-each>
</results>
</run2>
</results>
</xsl:template>
</xsl:stylesheet>
アプリでXML::XSLTを使用したときに得られる出力は次のとおりです。
<?xml version="1.0" encoding="UTF-8"?>
<results xmlns="http://max.gov" xmlns:pre="http://max.gov" xmlns:exslt="http://exslt.org/common">
<run1 name="exslt:node-set($PRE)//pre:item">
<results/>
</run1>
</results>
(ノードセット関数が機能しなかっただけでなく、要素が完全にスキップされたことに注意してください。)コードは基本的に次のとおりです。
xslt = XML::XSLT.new()
xslt.xml = @xml # @xml string
xslt.xsl = @record.xslt # xslt is stored in db
result = xslt.serve
render :xml => result
期待される出力は次のとおりです
<?xml version="1.0" encoding="UTF-8"?>
<results xmlns="http://max.gov" xmlns:pre="http://max.gov" xmlns:exslt="http://exslt.org/common">
<run1 name="exslt:node-set($PRE)//pre:item">
<results>
<success position="1"/>
<success position="2"/>
</results>
</run1>
<run2 name="exslt:node-set($PRE)//pre:item">
<results>
<success position="1"/>
<success position="2"/>
</results>
</run2>
</results>
次のいずれかを実行すると、この正しい結果が得られます…</ p>
- コマンドラインからxsltprocを実行します
- Railsコンソールで以下を実行します
xslt = XML :: XSLT.new xslt.xml = File.read('data.xml')
xslt.xsl = File.read('test.xsl')xslt.serve