首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XSLT3.0将转换后的节点提取为多个文档

XSLT3.0将转换后的节点提取为多个文档
EN

Stack Overflow用户
提问于 2020-11-09 06:44:40
回答 1查看 544关注 0票数 0

我有这个XML结构

代码语言:javascript
复制
<doc>
  <Bundle>
    <entry>
      <Observation>
          <id value="o1-3" />
          <subject>
            <reference value="Subject/1" />
          </subject>
          <valueQuantity>
            <value value="400" />
            <unit value="U" />
          </valueQuantity>
          <referenceRange>
            <low>
              <value value="0" />
              <unit value="U" />
            </low>
            <high>
              <value value="45" />
              <unit value="U" />
            </high>
          </referenceRange>
        </Observation>
    </entry>
    <entry>
        <Observation>
          <id value="o8-3" />
          <subject>
            <reference value="Subject/1" />
          </subject>
          <valueQuantity>
            <value value="0.39" />
            <unit value="L" />
          </valueQuantity>
          <referenceRange>
            <low>
              <value value="0.14" />
              <unit value="L" />
            </low>
            <high>
              <value value="0.35" />
              <unit value="L" />
            </high>
          </referenceRange>
        </Observation>
    </entry>
  </Bundle>
  <Bundle>
    <entry>
        <Observation>
          <id value="o3-4" />
          <subject>
            <reference value="Subject/2" />
          </subject>
          <valueQuantity>
            <value value="10" />
            <unit value="U" />
          </valueQuantity>
          <referenceRange>
            <low>
              <value value="3" />
              <unit value="U" />
            </low>
            <high>
              <value value="30" />
              <unit value="U" />
            </high>
          </referenceRange>
        </Observation>
    </entry>
    <entry>
       <Observation>
          <id value="o15-4" />
          <subject>
            <reference value="Subject/2" />
          </subject>
          <valueQuantity>
            <value value="7.1" />
            <unit value="m" />
          </valueQuantity>
          <referenceRange>
            <low>
              <value value="3.5" />
              <unit value="m" />
            </low>
            <high>
              <value value="5.0" />
              <unit value="m" />
            </high>
          </referenceRange>
        </Observation>
    </entry>
  </Bundle>
</doc>

我现正发展以下机制:

如果entry

  • Extract
  1. 解释valueQuantity是否偏离referenceRange,则将按Observation/subject分组的Observation节点转换为单独的文档。

正确解释的Observation和提取的文档如下:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<Interpretation xmlns="http://intelli.org/interpretation">
  <Subject>Subject/1</Subject>
  <Observations>
    <id value="o1-3"/>
    <subject>
      <reference value="Subject/1"/>
    </subject>
    <valueQuantity>
      <value value="400"/>
      <unit value="U"/>
    </valueQuantity>
    <referenceRange>
      <low>
        <value value="0"/>
        <unit value="U"/>
      </low>
      <high>
        <value value="45"/>
        <unit value="U"/>
      </high>
  </referenceRange></Observations></Interpretation>

我的XSLT:

代码语言:javascript
复制
<!-- Interpretation Starts -->
<xsl:template match="valueQuantity">
  <xsl:param name="value" as="xs:double*" select="value/@value" />
  <xsl:param name="low" as="xs:double*" select="following::referenceRange[1]/low/value/@value" />
  <xsl:param name="high" as="xs:double*" select="following::referenceRange[1]/high/value/@value" />
  <xsl:if test="$value lt $low or $value gt $high">
    <xsl:element name="Interpretation">
    </xsl:element>
  </xsl:if>
  <!-- Interpretation Ends -->
  <!-- Identity Transform -->
  <xsl:copy-of select="." />
  <!-- Extraction Starts: Locality? -->
  <xsl:for-each select="parent::Observation">
     <xsl:result-document include-content-type="no" href="/interpret&amp;extract/deviation/{concat('interpretation/', id/@value, '.xml')}">
      <xsl:copy-of select="." />
    </xsl:result-document>
  </xsl:for-each>
</xsl:template>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-09 08:51:43

我想(因为您还没有清楚地解释),您正在尝试将具有相同entry/subject/reference值的所有entry/subject/reference元素写入相同的输出文件。规范不允许这样做(原因有很多:结果将取决于执行顺序,并行执行将变得非常困难,产生的XML文档将没有外部包装器元素)。

相反,对输入进行单独的传递,以生成此输出文件,使用以下内容

代码语言:javascript
复制
<xsl:for-each-group select="entry" group-by="subject/reference/@value">
   <xsl:result-document href="{...}">
      <wrapper>
         <xsl:copy-of select="current-group()"/>
      </wrapper>
   </xsl:result-document>
</xsl:for-each-group>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64746906

复制
相关文章

相似问题

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