XSLT1.0如何基于条件测试格式化输出

XSLT1.0如何基于条件测试格式化输出,xslt,xslt-1.0,Xslt,Xslt 1.0,我试图读取一个包含一系列子节点的xml文件。基于其中一个子节点(在一个集合中)的值,我希望该特定输出以粗体显示 以下是xml示例: <documentationOf> <event> <effectiveTime> <low value="9/4/2013" /> </effectiveTime> </event> </documentationOf> <entry>

我试图读取一个包含一系列子节点的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/@值是今天的日期(在/event/effectiveTime/low/@值的文档中),那么我希望它以粗体显示:

Product 1
<b>Product 2</b>
Product 3
产品1
产品2
产品3
以下是为此截取的XSL:

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


我意识到我可能应该用它自己的模板来做这件事,但我没有写xsl msyelf,为了时间的利益,我正在处理它。但是,我正在尝试与模板并行地重做它(正确的方法),但仍然需要知道检查effectiveTime/low/@值的最佳方法,以便在输出中使条目加粗


提前感谢您的帮助。

以下是我将使用的流程

首先创建一个包含今天日期的全局变量

<xsl:variable name="today" select="//documentationOf/event/effectiveTime/low/@value"/>
然后使用
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>

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

运行此命令后,它将生成此输出

<span>Product 1</span><br/>
<span style="font-weight:bold;">Product 2</span><br/>
<span>Product 3</span><br/>
产品1
产品2
产品3

以下是我将使用的流程

首先创建一个包含今天日期的全局变量

<xsl:variable name="today" select="//documentationOf/event/effectiveTime/low/@value"/>
然后使用
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>

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

运行此命令后,它将生成此输出

<span>Product 1</span><br/>
<span style="font-weight:bold;">Product 2</span><br/>
<span>Product 3</span><br/>
产品1
产品2
产品3

因此,您需要对照从兄弟姐妹的
文档中提取的日期检查每个
条目的日期:

<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
及其相应的
事件
s被分组在一个公共父元素下,并且每组
事件
元素只有一个
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
及其相应的
事件
s被分组在一个公共父元素下,并且每组
事件
元素只有一个
documentationOf
同级(如果有多个,则只使用第一个元素的有效时间).

XSLT 1.0没有任何日期函数。这意味着您需要使用扩展。您能在XSL处理器中使用类似EXSLT的东西吗?我不知道。我可以问一下。因此,您的意思是,我无法将该低/@值与Date或Now()进行比较?您使用的是哪个XSLT处理器?实际上。。我有另一个节点(将更新该示例),该节点具有我要将其与之比较的日期。XSLT 1.0没有任何日期函数。这意味着您需要使用扩展。您能在XSL处理器中使用类似EXSLT的东西吗?我不知道。我可以问一下。因此,您的意思是,我无法将该低/@值与Date或Now()进行比较?您使用的是哪个XSLT处理器?实际上。。我有另一个节点(将更新示例),它有我想要比较的日期。这非常完美。非常感谢。当我正确使用模板时,我仍然可以使用它。这看起来很完美。非常感谢。当我正确使用模板时,我仍然可以使用它。