首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将XSLT转换为XQuery

将XSLT转换为XQuery
EN

Stack Overflow用户
提问于 2020-07-31 19:04:39
回答 1查看 612关注 0票数 1

我有diagnosis.xml文档

代码语言:javascript
复制
<diagnosis>
  <component name="heart attack" classCode="healthcare service">
    <component name="Diabetes I" classCode="observation" spec="intraocular lens">
      <component name="Diabetes II" classCode="manifestation">
        <component name="Diabetic Retinopathy" classCode="RSON :: rational service" spec="generalized obesity"/>
      </component>
      <component name="Coronary Artery Disease" classCode="ACT :: healthcare service" spec="hypertension"/>
    </component>
    <component name="nonproliferative diabetic retinopathy" classCode="ACT">
      <component name="Ophthalmic diagnosis" classCode="OBS observation" spec="Viscoelastic applied"/>
    </component>
  </component>
  <component name="Extracapsular cataract removal" classCode="PCPR :: care provision">
    <component name="intraocular lens" classCode="Allopathic & Osteopathic" spec="Diabetes I">
      <component name="Viscoelastic applied" classCode="SBADM :: substance administration" spec="Ophthalmic diagnosis"/>
    </component>
    <component name="lipoprotein cholesterol " classCode="BATTERY">
      <component name="Furosemide" classCode="SBADM :: substance administration"/>
      <component name="hypertension" classCode="OBS" spec="Coronary Artery Disease">
        <component name="generalized obesity" classCode="observation" spec="Diabetic Retinopathy"/>
      </component>
    </component>
  </component>
</diagnosis>

为了发现namespec之间的复杂性(类似于RDBMS中的PK-FK ),我使用了diagnosis-q1-q4.xsl

代码语言:javascript
复制
<xsl:template match="diagnosis">
        <xsl:variable name="q"  select="//component"/>
        <result>
            <!-- for each q3 -->
            <xsl:for-each select="$q[../../../component]">
                <!-- get quartile/Q1  -->
                <quartile Q1="{../../@name}" Q3="{@name}"/>
                <!-- get quartile/Q1-spec if quartile/Q1's spec exists -->
                <xsl:if test="../../@spec">
                    <dup q1-spec="{../../@spec}" q3="{@name}"/>
                </xsl:if>
                <!-- get parent's spec of this component  --> 
                <xsl:variable name="q2" select="../@spec"/>
                <!-- get parent of q2 if exists -->
                <xsl:variable name="q3" select="$q[component/@name=$q2]"/>
                <xsl:if test="$q3">
                    <dup q2-spec="{$q3/@name}" q3="{@name}"/>
                    <xsl:if test="$q3/@spec">
                        <dup q3-spec="{$q3/@spec}" q3="{@name}"/>
                    </xsl:if>
                </xsl:if>
            </xsl:for-each>
        </result>
</xsl:template>
    
</xsl:stylesheet>

diagnosis-q1-q4.xsl等效为diagnosis-q1-q4.xqy

代码语言:javascript
复制
xquery version "1.0-ml";
<Lineage>
{
  for $gp in doc("diagnosis.xml")//component,
      $p in $gp/component, 
      $gc in $p/component
  return
    if (exists($gp/@spec))
    then (<quartile Q1="{ $gp/@name }" Q3="{ $gc/@name }"/>,
          <quartile-spec Q1-spec="{ $gp/@spec }" q3="{ $gc/@name }"/>)
    else (<quartile Q1="{ $gp/@name }" Q3="{ $gc/@name }"/>)
}
{
  for $gp in doc("diagnosis.xml")//component,
      $p in $gp/component[@spec != ''], 
      $gc in $p/component 
  return
    let $p-spec := $p/@spec
    for $p-node in doc("diagnosis.xml")//component
    where every $andante in $p-node/@name
    satisfies ($andante = $p-spec)
    return
      if (exists($p-node/../@spec))
        then (<quartile-spec q2-spec-Q1="{ $p-node/../@name }" q3="{ $gc/@name }"/>,
              <quartile-spec q2-spec-Q1-spec="{ $p-node/../@spec }" q3="{ $gc/@name }"/>)
         else (<quartile-spec q2-spec-Q1-="{ $p-node/../@name }" q3="{ $gc/@name }"/>)
}
</Lineage>

或诊断-Q1-q4.xsl或诊断-Q1-q4.xqy产生相同的结果:

  • 八对:即时gp(Q1)::gc(Q3)
  • 一对: gp-spec (Q1- spec ) ::gc(Q3)
  • 四对:父级规格( q2-spec-Q1 ) ::gc(Q3)
  • 一对:q2-spec-q1 (q2-spec-Q1-spec) ::gc(Q3)

f 226

代码语言:javascript
复制
<Lineage>
   <quartile Q1="heart attack" Q3="Diabetes II"/>
   <quartile Q1="heart attack" Q3="Coronary Artery Disease"/>
   <quartile Q1="heart attack" Q3="Ophthalmic diagnosis"/>
   <quartile Q1="Diabetes I" Q3="Diabetic Retinopathy"/>
   <quartile-spec Q1-spec="intraocular lens" q3="Diabetic Retinopathy"/>
   <quartile Q1="Extracapsular cataract removal" Q3="Viscoelastic applied"/>
   <quartile Q1="Extracapsular cataract removal" Q3="Furosemide"/>
   <quartile Q1="Extracapsular cataract removal" Q3="hypertension"/>
   <quartile Q1="lipoprotein cholesterol " Q3="generalized obesity"/>
   <quartile-spec q2-spec-Q1-="Extracapsular cataract removal" q3="Diabetes II"/>
   <quartile-spec q2-spec-Q1-="Extracapsular cataract removal"
                  q3="Coronary Artery Disease"/>
   <quartile-spec q2-spec-Q1-="heart attack" q3="Viscoelastic applied"/>
   <quartile-spec q2-spec-Q1="Diabetes I" q3="generalized obesity"/>
   <quartile-spec q2-spec-Q1-spec="intraocular lens" q3="generalized obesity"/>
</Lineage>

我的问题是:

  1. 可以简化diagnosis-q1-q4.xqy吗?
  2. 可以用XSLT3.0简化diagnosis-q1-q4.xsl吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-26 19:25:17

据我所知,您希望了解如何将XSLT转换为xquery。因此,我试图尽可能接近您提供的原始样式表。

代码语言:javascript
复制
xquery version "3.1";

let $doc := doc("diagnosis.xml")
let $q := $doc//component

for $c in $q[../../../component]
return (
    <quartile Q1="{$c/../../@name}" Q3="{$c/@name}"/>
    ,
    if (exists($c/../../@spec))
    then <dup q1-spec="{$c/../../@spec}" q3="{$c/@name}"/>
    else ()
    ,
    let $q2 := $c/../@spec
    let $q3 := $q[component/@name=$q2]
    return (
        if (exists($q3))
        then (
            <dup q2-spec="{$q3/@name}" q3="{$c/@name}"/>
            ,
            if (exists($q3/@spec))
            then <dup q3-spec="{$q3/@spec}" q3="{$c/@name}"/>
            else ()
        )
        else ()
    )
)

我还喜欢最初的方法,因为它只在所有匹配的组件上迭代一次。

希望这能让我们对两者的关系有所了解。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63197728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档