1

XMLデータがあります

   <logData>
      <log>
         <id>1</id>
      </log> 
      <log>
         <id>2</id>
      </log> 
      <log>
         <id>3</id>
      </log> 
      <log>
         <id>4</id>
      </log> 
   </logData>  

fn:subsequence関数を使用したxslt変換を使用してログの一部のみを取得したい

これが私のxsltです

<?xml version="1.0" encoding="UTF-8"?> 
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:fn="http://www.w3.org/2006/xpath-functions" version="1.0" >
       <xsl:output method="xml" indent="yes" />     
       <xsl:strip-space elements="*"/>

       <xsl:template match="/logData" >
          <xsl:element name="log">
             <xsl:copy-of select="fn:subsequence(./log, 2, 3)"/>
          </xsl:element>
       </xsl:template>
    </xsl:stylesheet>   

そして私は得る

ERROR:  'The first argument to the non-static Java function 'subsequence' is not a valid object reference.'  

JavaSE1.6の一部であるJava変換APIを使用しています。
手伝って頂けますか?

4

2 に答える 2

1

Javaを使用しているため、必要なのは、コードがXSLT1.0ではなくXSLT2.0プロセッサをロードすることを確認することだけです。JDKのデフォルトのXSLTプロセッサは、XSLT1.0のみをサポートします。

Saxon-HEをダウンロードし、システムプロパティを設定します

-Djavax.xml.transform.TransformerFactory = net.sf.saxon.TransformerFactoryImpl

コードが機能するはずです。

(もちろん、Dimitreが示すように、この変換はXSLT 1.0で十分簡単に​​実行できます。ただし、XSLT 1.0に固執することで、足首をつなぎ合わせて移動しようとしています。XSLT2.0は、はるかに強力で使いやすくなっています。 、およびご使用の環境で使用できるため、使用してください。)

于 2012-07-31T15:56:46.117 に答える
1
<xsl:copy-of select="fn:subsequence(./log, 2, 3)"/>

この関数subsequence()はXPath2.0で定義されており、XSLT2.0プロセッサーでのみ使用できます。

XSLT 1.0では、以下を使用します

<xsl:copy-of select="log[position() > 1 and not(position() > 4)]"/>

これが完全な変換です。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/*">
     <xsl:copy-of select="log[position() > 1 and not(position() > 4)]"/>
 </xsl:template>
</xsl:stylesheet>

これが提供されたXMLドキュメントに適用される場合:

<logData>
    <log>
        <id>1</id>
    </log>
    <log>
        <id>2</id>
    </log>
    <log>
        <id>3</id>
    </log>
    <log>
        <id>4</id>
    </log>
</logData>

必要な正しい結果が生成されます。

<log>
   <id>2</id>
</log>
<log>
   <id>3</id>
</log>
<log>
   <id>4</id>
</log>
于 2012-07-31T13:06:49.793 に答える