2012-07-31 71 views
1

我有XML數據XSLT,FN:subsequance,Java轉換

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

我想只得到使用FN使用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的一部分。
你能幫我嗎?

回答

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> 
+0

那麼,我可以做什麼intend的子序列()? – Ilya 2012-07-31 13:11:06

+0

@Ilya:這個答案完全爲您提供了您所要求的XSLT 1.0解決方案。 – 2012-07-31 13:14:46

1

由於您使用的是Java,所有你需要做的是確保你的代碼加載一個XSLT 2.0處理器,而不是XSLT 1.0。 JDK中的默認XSLT處理器僅支持XSLT 1.0。

下載撒克遜-HE和設置系統屬性

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

和你的代碼應該工作。 (當然,正如Dimitre所示,這個轉換在XSLT 1.0中可以很容易地完成,但是通過堅持使用XSLT 1.0,你正在試圖在腳踝處將你的腳連在一起.XSLT 2.0功能更加強大和更容易使用,並且它可在您的環境中使用,因此可以使用它。)