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.'  

我正在使用 Java 转换 API,它是 Java SE 1.6 的一部分。
你能帮助我吗?

4

2 回答 2

1
<xsl:copy-of select="fn:subsequence(./log, 2, 3)"/>

该函数subsequence()在 XPath 2.0 中定义,并且仅在 XSLT 2.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 回答
1

由于您使用的是 Java,因此您需要做的就是确保您的代码加载 XSLT 2.0 处理器而不是 XSLT 1.0。JDK 中的默认 XSLT 处理器仅支持 XSLT 1.0。

下载 Saxon-HE,并设置系统属性

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

你的代码应该可以工作。

(当然,正如 Dimitre 所展示的,这种转换在 XSLT 1.0 中可以很容易地完成。但是坚持使用 XSLT 1.0,您会尝试将脚绑在脚踝处移动。XSLT 2.0 更强大且更易于使用,并且它在您的环境中可用,因此请使用它。)

于 2012-07-31T15:56:46.117 回答