xslt逗号分隔值列表

时间:2011-07-25 09:22:29

标签: xslt

我正在使用自定义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"/>

其中这些将用逗号或换行符号分隔,但例如“区”可能为空,导致“道路,城市”等。

2 个答案:

答案 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处理器归档它的一些方法。