2

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

4

1 に答える 1

0

最終的にruby-xsltをNokogiriに置き換え、これで問題が修正されました

于 2012-10-31T12:50:18.723 に答える