我正在使用自定义XSLT样式表创建Microsoft InfoPath表单的摘要视图。
我在表单上选择了单选按钮“是”,“否”
e.g。
What is the primary construction of the building?
Steel Yes
No
Timber Yes
NO
etc....
在我的样式表中
<tr>
<td>
The primary contruction of the building is
<xsl:choose>
<xsl:when test="/my:myFields/my:BrickPrimaryConstruction= 'true'">
Brick
</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="/my:myFields/my:TimberPrimaryConstruction = 'true'">
Timber Framed
</xsl:when>
</xsl:choose>
<xsl:choose>
<xsl:when test="/my:myFields/my:ConcretePrimaryConstruction = 'true'">
Concrete Framed
</xsl:when>
</xsl:choose>
etc....
我想在最终的HTML输出中实现的目标是:
The primary construction of the building is Brick, Concrete Framed, Prefabricated
我没有太多XSLT的经验,但实现这一目标的最佳方法是什么?
避免这种情况:
, Concrete Framed, Prefabricated,
或
Brick, , Prefabricated
通常在C#中我会分配一个字符串,并在附加逗号之前检查它是否为空,然后在末尾修剪逗号但是我知道我不能在xslt中分配变量。
修改
我还提到我希望能够在其他情况下重用该功能,例如
<xsl:value-of select="/my:myFields/my:Road"/>,
<xsl:value-of select="/my:myFields/my:District"/>,
<xsl:value-of select="/my:myFields/my:City"/>,
<xsl:value-of select="/my:myFields/my:County"/>,
<xsl:value-of select="/my:myFields/my:Postcode"/>
其中这些将用逗号或换行符号分隔,但例如“区”可能为空,导致“道路,城市”等。
答案 0 :(得分:1)
试试这个:
<tr>
<td>
The primary contruction of the building is
<xsl:for-each select="/my:myFields/my:*[ends-with(local-name(), 'PrimaryConstruction') and (.='true')]">
<xsl:if test="position()!=1" xml:space="preserve">, </xsl:if>
<xsl:choose>
<xsl:when test="self::my:BrickPrimaryConstruction">Brick</xsl:when>
<xsl:when test="self::my:TimberPrimaryConstruction">Timber Framed</xsl:when>
<xsl:when test="self::my:ConcretePrimaryConstruction">Concrete Framed</xsl:when>
etc...
</xsl:choose>
</xsl:for-each>
基本上,for-each
遍历所有相关字段,以便您可以检查其位置,并且只有在您不在第一个项目上时才会发出逗号(XSLT具有从1开始的索引)。由于for-each
已经只过滤了相关条目,因此我们只需检查类型,而不是值true
。
请注意,如果您愿意,可以扩展相同的原则,为最后一项而不是逗号发出“和”。
答案 1 :(得分:0)
也许看看Implode。
然后,你可以做
<xsl:variable name="theItems">
<xsl:if test="/my:myFields/my:BrickPrimaryConstruction= 'true'">
<foo>Brick</foo>
</xsl:if>
</xsl:variable>
<xsl:call-template name="implode">
<xsl:with-param name="items" select="exsl:node-set($theItems)" />
</xsl:call-template>
您必须将$theItems
(一个xml片段)转换为节点集。这只能使用非标准方法存档。 XML.com显示了使用各种XML处理器归档它的一些方法。