XSLT1.0如何基于条件测试格式化输出
我试图读取一个包含一系列子节点的xml文件。基于其中一个子节点(在一个集合中)的值,我希望该特定输出以粗体显示 以下是xml示例:XSLT1.0如何基于条件测试格式化输出,xslt,xslt-1.0,Xslt,Xslt 1.0,我试图读取一个包含一系列子节点的xml文件。基于其中一个子节点(在一个集合中)的值,我希望该特定输出以粗体显示 以下是xml示例: <documentationOf> <event> <effectiveTime> <low value="9/4/2013" /> </effectiveTime> </event> </documentationOf> <entry>
<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处理器?实际上。。我有另一个节点(将更新示例),它有我想要比较的日期。这非常完美。非常感谢。当我正确使用模板时,我仍然可以使用它。这看起来很完美。非常感谢。当我正确使用模板时,我仍然可以使用它。