1

我正在尝试读取具有一系列子节点的 xml 文件。基于其中一个子节点(在一组内)的值,我希望该特定输出加粗。

这是xml示例:

<documentationOf>
  <event>
    <effectiveTime>
      <low value="9/4/2013" />
    </effectiveTime>
  </event>
</documentationOf>
<entry>
  <substanceAdministration>
    <text>
      <reference value="">
      </reference>
    </text>
    <effectiveTime>
      <low value="5/13/2013 12:00:00 AM" />
      <high value="UNK" />
    </effectiveTime>
    <consumable>
      <manufacturedProduct>
        <manufactueredMaterial>
          <code code="" displayName="Product 1">
          </code>
        </manufacturedMaterial>
      </manufacturedProduct>
    </consumable>
  </substanceAdministration>
</entry>
<entry>
  <substanceAdministration>
    <text>
      <reference value="">
      </reference>
    </text>
    <effectiveTime>
      <low value="9/4/2013 12:00:00 AM" />
      <high value="UNK" />
    </effectiveTime>
    <consumable>
      <manufacturedProduct>
        <manufactueredMaterial>
          <code code="" displayName="Product 2">
          </code>
        </manufacturedMaterial>
      </manufacturedProduct>
    </consumable>
  </substanceAdministration>
</entry>
<entry>
  <substanceAdministration>
    <text>
      <reference value="">
      </reference>
    </text>
    <effectiveTime>
      <low value="5/13/2013 12:00:00 AM" />
      <high value="UNK" />
    </effectiveTime>
    <consumable>
      <manufacturedProduct>
        <manufactueredMaterial>
          <code code="" displayName="Product 3">
          </code>
        </manufacturedMaterial>
      </manufacturedProduct>
    </consumable>
  </substanceAdministration>
</entry>

我希望代码/@displayName 出现(我可以做一个 for-each 并让它工作)但是如果 effectiveTime/low/@value 是今天的日期(在 documentationOf/event/effectivetime/low/@值),那么我希望它以粗体显示:

Product 1
<b>Product 2</b>
Product 3

这是为此截取的 XSL:

<xsl:for-each select="entry">
  <xsl:value-of select="substanceAdministration/consumable/manufacturedProduct/manufacturedMaterial/code/@displayName" />
  <br />
</xsl:for-each>

我意识到我可能应该用它自己的模板来做这件事,但我没有写 xsl msyelf 并且为了时间的利益,我正在使用那里的东西。然而,我正在尝试与模板并行重做它(正确的方式),但仍然需要知道检查有效时间/低/@值以使输出中的条目粗体的最佳方法。

提前感谢您的帮助。

4

2 回答 2

1

这是我将使用的过程。

首先使用您今天的日期创建一个全局变量。

<xsl:variable name="today" select="//documentationOf/event/effectiveTime/low/@value"/>

然后,您可以更新您的for-each以包含对模板的调用和span添加粗体样式的 a。

<xsl:for-each select="entry">
  <xsl:variable name="IsToday">
    <xsl:call-template name="compareToday">
      <xsl:with-param name="date" select="substanceAdministration/effectiveTime/low/@value"/>
    </xsl:call-template>
  </xsl:variable>
  <span>
    <xsl:if test="$IsToday = 'true'">
      <xsl:attribute name="style">
        <xsl:text>font-weight:bold;</xsl:text>
      </xsl:attribute>
    </xsl:if>
    <xsl:value-of select="substanceAdministration/consumable/manufacturedProduct/manufacturedMaterial/code/@displayName" />
  </span>
  <br />
</xsl:for-each>

然后compareToday命名模板来比较你的两个日期。

<xsl:template name="compareToday">
  <xsl:param name="date"/>
  <xsl:if test="substring($date,0,(string-length($date) - 11)) = $today">
    <xsl:text>true</xsl:text>
  </xsl:if>
</xsl:template>

您会注意到,在上面的模板中,我必须获取日期的子字符串,以便它与今天日期变量的格式相匹配。如果格式与这两个不同,则需要更新此模板以将它们都转换为相同的格式,然后才能进行比较。

运行它后,它会产生这个输出。

<span>Product 1</span><br/>
<span style="font-weight:bold;">Product 2</span><br/>
<span>Product 3</span><br/>
于 2013-09-04T16:26:54.127 回答
0

因此,您需要entry根据从其documentationOf兄弟姐妹中提取的日期检查每个日期:

<xsl:for-each select="entry">
  <xsl:variable name="displayName" select="substanceAdministration/consumable/manufacturedProduct/manufacturedMaterial/code/@displayName" />
  <xsl:choose>
    <xsl:when test="starts-with(substanceAdministration/effectiveTime/low/@value,
                                ../documentationOf/event/effectiveTime/low/@value)">
      <b><xsl:value-of select="$displayName" /></b>
    </xsl:when>
    <xsl:otherwise>
      <xsl:value-of select="$displayName" />
    </xsl:otherwise>
  </xsl:choose>
  <br />
</xsl:for-each>

这假设 thedocumentationOf及其对应event的 s 被分组在一个共同的父元素下,并且每组元素只有一个documentationOf兄弟event元素(如果有多个元素,则仅使用一个元素的有效时间)。

于 2013-09-04T17:05:13.390 回答