xslt 1.0如何根据条件测试格式化输出

时间:2013-09-04 14:16:10

标签: xslt xslt-1.0

我正在尝试读取具有一系列子节点的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出现(我可以为每个人做一个并让它工作)但是如果effectiveTime / low / @值是今天的日期(在documentationOf / event / effectivetime /中)低/ @值),然后我希望它以粗体显示:

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,为了时间的利益,我正在做那里的事情。但是,我试图与模板并行地重做它(正确的方法),但是仍然需要知道检查有效时间/低/ @值的最佳方法,以使输入中的条目变为粗体。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

这是我将使用的过程。

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

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

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

<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/>

答案 1 :(得分: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>

这假设documentationOf及其对应的event分组在一个共同的父元素下,并且每组documentationOf元素只有一个event兄弟(如果那里不止一个,只会使用第一个的有效时间。)