[ 
https://issues.apache.org/jira/browse/XALANJ-2799?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17936188#comment-17936188
 ] 

Mukul Gandhi commented on XALANJ-2799:
--------------------------------------

[~martin.honnen]
I've committed few code changes to XPathParser to help resolve this issue. 
After these code changes, I'm getting an XSL transform output as follows,

<?xml version="1.0" encoding="UTF-8"?><set>
  <problem>
    <question>Which lots have red cars?</question>
    <answer/>
  </problem>
</set>

I've think, that above mentioned XSL transform output is correct.

The reason is following according to me,
For XPath expression key('car-by-color', 'red') / key('lot-for-car', @vin)   
the key(..) function call after / is not getting any non empty node as context 
node.

Please confirm, whether the fix committed is ok.

> java.lang.ClassCastException: org.apache.xpath.objects.XString cannot be cast 
> to java.lang.String when using XSLT key function on the right side of step 
> operator /
> -------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: XALANJ-2799
>                 URL: https://issues.apache.org/jira/browse/XALANJ-2799
>             Project: XalanJ2
>          Issue Type: Bug
>      Security Level: No security risk; visible to anyone(Ordinary problems in 
> Xalan projects.  Anybody can view the issue.) 
>          Components: transformation, Xalan, Xalan-CmdLine
>    Affects Versions: The Latest Development Code
>         Environment: Java 8, Windows 11
>            Reporter: Martin Honnen
>            Priority: Major
>         Attachments: cars.xml, key-fn-call-in-last-step-test1.xsl
>
>
> Working with the latest  XSLT 3.0 branch of Apache Xalan, I get an exception 
> `java.lang.ClassCastException: org.apache.xpath.objects.XString cannot be 
> cast to java.lang.String` when trying to use the XSLT `key` function on the 
> right side of the "path" operator `/` e.g. `key('car-by-color', 'red') / 
> key('lot-for-car', @vin)`.
> I would expect the right side of the / to be evaluated for each node selected 
> by the expression on the left side of /, without giving any errors. This is 
> an established XPath 2 and XSLT 2 coding pattern.
> The full code
> {code:xml}
> <?xml version="1.0" encoding="utf-8"?>
> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
>   version="3.0"
>   xmlns:xs="http://www.w3.org/2001/XMLSchema";
>   exclude-result-prefixes="xs">
>   <xsl:output method="xml" indent="yes"/>
>   <xsl:key name="car-by-color" match="cars/car" use="@color"/>
>      
>   <xsl:key name="lot-for-car" match="lot" use="car/@vin"/>
>    
>   <xsl:template match="lot">
>       <lot id="{@id}"/>
>   </xsl:template>
>   
>   <xsl:template match="/">
>       <set>
>           <problem>
>               <question>Which lots have red cars?</question>
>               <answer>
>                   <xsl:apply-templates select="key('car-by-color', 'red') / 
> key('lot-for-car', @vin)"/>
>               </answer>
>           </problem>
>       </set>
>   </xsl:template>
> </xsl:stylesheet>
> {code} 
> Sample XML input is e.g.
> {code:xml}
> <dir>
>     <cars>
>         <car vin="101" color="red"/>
>         <car vin="102" color="green"/>
>         <car vin="103" color="red"/>
>         <car vin="104" color="red"/>
>     </cars>
>     <lots>
>         <lot id="L">
>             <car vin="101"/>
>             <car vin="103"/>
>         </lot>
>         <lot id="M">
>             <car vin="102"/>
>         </lot>
>         <lot id="N">
>             <car vin="104"/>
>         </lot>
>     </lots>
> </dir>
> {code}
>  Full error output:
> {code}
> (Position des Fehlers unbekannt)java.lang.ClassCastException: 
> org.apache.xpath.objects.XString cannot be cast to java.lang.String
> (Position des Fehlers unbekannt)XSLT-Fehler 
> (javax.xml.transform.TransformerException): Keine Verarbeitungsanweisung f³r 
> xml-stylesheet gefunden in 
> ..\..\OneDrive\Documents\xslt\blog-xslt-3-by-example\xalan-xslt3-tests\cars.xml.
> Exception in thread "main" java.lang.RuntimeException: Keine 
> Verarbeitungsanweisung für xml-stylesheet gefunden in 
> ..\..\OneDrive\Documents\xslt\blog-xslt-3-by-example\xalan-xslt3-tests\cars.xml.
>         at org.apache.xalan.xslt.Process.doExit(Process.java:1176)
>         at org.apache.xalan.xslt.Process.main(Process.java:1149)
> {code}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@xalan.apache.org
For additional commands, e-mail: dev-h...@xalan.apache.org

Reply via email to