4

我正在使用使用 xpath 版本 2 功能的 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>
4

3 回答 3

3

下面是相关 XPath 2.0 函数的映射:

XPath 2.0 XPath 1.0 Xalan-Java XSLT-C
fn:exists() 字符串长度(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:最大值数学:最大值
fn:最大动态:最大
fn:min 最小数学:min
fn:min 动态:min
fn:总和数学:总和
fn:sum 动态:sum
fn:平均总和 div 计数
fn:地板地板
fn:天花板
fn:圆形
fn:abs 数学:abs
fn:收藏夹
操作:连接追加
fn:doc 文档
fn:计数
fn:不是不是
fn:真真
fn:假假
fn:boolean 布尔值
fn:大写 str:to-upper
fn:小写 str:to-lower
fn:substring 子串
fn:字符串长度 字符串长度
fn: 归一化空间归一化空间
fn:翻译翻译
fn:concat str:concat 连接
fn:substring-before substring-before
fn:substring-after 子串后
fn:反向 str:向后
fn:insert-before str:insert-at        
fn:matches str:字符串匹配
fn:tokenize str:tokenize
fn:resolve-uri uri:resolve-uri
fn:distinct-values 集:distinct
操作:工会 |
操作:相交集:交集
操作:除了 cmp:差异集:差异
操作:同节点 cmp:cmp
fn:位置节点:xpath 位置
fn:最后最后
fn:数据节点:类型
fn: 朗朗
fn:当前日期时间日期:日期时间
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:分钟-从-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] | $默认[不是($var)]

参考

于 2014-06-17T17:53:19.840 回答
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:exists,fn:string并且fn:boolean可以替换,当然如果有使用 XPath/XSLT 2.0 之类的东西,tokenize或者for-each-group您需要更多的工作,也许需要 Xalan 特定的扩展功能。

于 2013-05-21T16:47:22.040 回答
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>
于 2013-05-21T23:35:38.467 回答