我正在尝试读取具有一系列子节点的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,为了时间的利益,我正在做那里的事情。但是,我试图与模板并行地重做它(正确的方法),但是仍然需要知道检查有效时间/低/ @值的最佳方法,以使输入中的条目变为粗体。
提前感谢您的帮助。
答案 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
兄弟(如果那里不止一个,只会使用第一个的有效时间。)