0

我正在使用 xslt 动态评估 (dyn:evaluate) 但我有一个问题,这个评估函数在一个循环内,我想在不同的上下文而不是循环上下文上进行评估,比如

<xsl:variable name="recId" select="dyn:evaluate($targetContext,$list[1])"/> 但是 dyn:evaluate 只有一个输入是一个变量,所以我不得不做这样的事情 <xsl:variable name="recId" select="dyn:evaluate($list[1])"/>

这也是我的模板

<xsl:template match="hl7:controlActEvent/hl7:subject">
<xsl:for-each select="java:org.apache.xalan.lib.ExsltStrings.tokenize($xpath, ';')">
<xsl:variable name="list" select="java:org.apache.xalan.lib.ExsltStrings.tokenize(., ',')"/>
here's the problem, evaluation inside loop
<xsl:variable name="recId" select="dyn:evaluate($list[1])"/>
<xsl:variable name="createDate" select="dyn:evaluate($list[2])"/>
<xsl:choose>
<xsl:when test="$createDate != '' ">
<xsl:variable name="detailNode" select="$postDomainDoc/record_detail[record_id = $recId]"/>
<xsl:choose>
<xsl:when test="$detailNode/consent_status = 'deny' ">
<hl7:subject typeCode="SUBJ" nullFlavor="MSK" xsi:nil="true"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="@*|node()"/>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<xsl:when test="$createDate = '' and $ehipDecision = 'deny'">
<hl7:subject typeCode="SUBJ" nullFlavor="MSK" xsi:nil="true"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="@*|node()"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:template>

任何建议。

4

1 回答 1

0

如果您想在模板匹配的节点的上下文中评估表达式,您可以通过在 之外的变量中捕获该节点来获得大部分方法for-each,然后使用嵌套的“重置上下文”for-each

<xsl:template match="hl7:controlActEvent/hl7:subject">
  <xsl:variable name="theSubject" select="." />
  <xsl:for-each select="java:org.apache.xalan.lib.ExsltStrings.tokenize($xpath, ';')">
    <xsl:variable name="list" select="java:org.apache.xalan.lib.ExsltStrings.tokenize(., ',')"/>
    <xsl:for-each select="$theSubject">
      <!-- rest of template goes here, . is now the hl7:subject again -->
    </xsl:for-each>
  </xsl:for-each>
</xsl:template>

这将.返回正确的内容,但position()内部 for-each 将始终为 1,如果您需要访问外部,则position()必须类似地将其保存在变量中。

于 2013-07-16T18:14:46.147 回答