如何将XSLT版本2.0转换为版本1.0

4

我正在使用一个使用XPath 2.0函数的XSLT文档。但我只有Xalan 2.6 jar,它只支持XSLT 1.0处理器,这是一个不可改变的限制..请问是否有任何工具可以将XPath 2.0函数转换为1.0?

<xsl:variable name="var1_ClinicalDocument" as="node()?" select="ns0:ClinicalDocument"/>
        <DSMessage>
            <DSPatient>
                <xsl:for-each 

    select="$var1_ClinicalDocument[fn:exists(ns0:id/@root)]">
                        <Source>
                            <xsl:sequence select="fn:string(ns0:id/@root)"/>
                        </Source>
                    </xsl:for-each>
                    <Demographics>
                        <xsl:for-each select="($var1_ClinicalDocument/ns0:recordTarget/ns0:patientRole/ns0:id)[fn:exists(@extension)]">
                            <externalID>
                                <xsl:sequence select="fn:string(@extension)"/>
                            </externalID>
                        </xsl:for-each>
                        <xsl:for-each select="($var1_ClinicalDocument/ns0:recordTarget/ns0:patientRole/ns0:patient/ns0:name/ns0:given/node())[fn:boolean(self::text())]">
                            <firstName>
                                <xsl:sequence select="fn:string(.)"/>
                            </firstName>
3个回答

3
以下是XPath 2.0函数的映射:
XPath 2.0 XPath 1.0 Xalan-Java XSLT-C fn:exists() string-length(concat(., ) ) XPath 1.0 XPath 1.0 fn:string() string() XPath 1.0 XPath 1.0 fn:boolean() boolean() XPath 1.0 XPath 1.0
EXSLT、XSLTSL、FXSL和XPath算法可以填补大部分剩余功能。
XPath 2.0 FXSL XSLTSL EXSLT XPath 1.0 fn:max maximum math:max fn:max dyn:max fn:min minimum math:min fn:min dyn:min fn:sum sum math:sum sum fn:sum dyn:sum fn:avg sum除以count fn:floor floor fn:ceiling ceiling fn:round round fn:abs math:abs fn:collection foldl op:concatenate append fn:doc document fn:count count fn:not not fn:true true fn:false false fn:boolean boolean fn:upper-case str:to-upper fn:lower-case str:to-lower fn:substring substring fn:string-length string-length fn:normalize-space normalize-space fn:translate translate fn:concat str:concat concat fn:substring-before substring-before fn:substring-after substring-after fn:reverse str:backward fn:insert-before str:insert-at fn:matches str:string-match fn:tokenize str:tokenize fn:resolve-uri uri:resolve-uri fn:distinct-values set:distinct op:union | op:intersect set:intersection op:except cmp:diff set:difference op:is-same-node cmp:cmp fn:position node:xpath position fn:last last fn:data node:type fn:lang lang fn:current-dateTime date:date-time fn:dateTime dt:format-date-time date:format-date fn:year-from-date dt:get-xsd-datetime-year date:day-in-year fn:month-from-dateTime dt:get-xsd-datetime-month date:month-name fn:day-from-dateTime dt:get-xsd-datetime-day date:day-name fn:hours-from-dateTime dt:get-xsd-datetime-hour date:hour-in-day fn:minutes-from-dateTime dt:get-xsd-datetime-minute date:minute-in-hour fn:seconds-from-dateTime dt:get-xsd-datetime-second date:second-in-minute fn:timezone-from-dateTime dt:get-xsd-datetime-timezone if (...) then (...) else(...) $dynamic[$var] | $default[not($var)]
参考资料

2

我会尝试,但这未经测试:

<xsl:variable name="var1_ClinicalDocument" select="ns0:ClinicalDocument"/>
        <DSMessage>
            <DSPatient>
                <xsl:for-each 

    select="$var1_ClinicalDocument[ns0:id/@root]">
                        <Source>
                            <xsl:value-of select="ns0:id/@root"/>
                        </Source>
                    </xsl:for-each>
                    <Demographics>
                        <xsl:for-each select="($var1_ClinicalDocument/ns0:recordTarget/ns0:patientRole/ns0:id)[@extension]">
                            <externalID>
                                <xsl:value-of select="@extension"/>
                            </externalID>
                        </xsl:for-each>
                        <xsl:for-each select="($var1_ClinicalDocument/ns0:recordTarget/ns0:patientRole/ns0:patient/ns0:name/ns0:given/node())[self::text()]">
                            <firstName>
                                <xsl:value-of select="."/>
                            </firstName>

基本上,可以替换使用fn:existsfn:stringfn:boolean,当然如果使用了XPath/XSLT 2.0的函数,如tokenizefor-each-group,则需要更多的工作,可能需要使用Xalan特定的扩展函数。


1
这应该是一篇不错的翻译:
    <xsl:variable name="var1_ClinicalDocument" select="ns0:ClinicalDocument"/>
    <DSMessage>
      <DSPatient>
        <xsl:for-each select="$var1_ClinicalDocument[ns0:id/@root]">
          <Source>
            <xsl:value-of select="ns0:id/@root"/>
          </Source>
        </xsl:for-each>
        <Demographics>
          <xsl:for-each select=
            "($var1_ClinicalDocument/ns0:recordTarget
                     /ns0:patientRole/ns0:id)[@extension]">
            <externalID>
             <xsl:value-of select="concat(@extension, ' ')"/>
            </externalID>
          </xsl:for-each>
          <xsl:for-each select=
           "$var1_ClinicalDocument/ns0:recordTarget/ns0:patientRole
                                  /ns0:patient/ns0:name/ns0:given/text()">
            <firstName>
              <xsl:value-of select="."/>
            </firstName>
          </xsl:for-each>
        </Demographics>
       </DSPatient>
    </DSMessage>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接