xslt запятая отдельный список значений - PullRequest
0 голосов
/ 25 июля 2011

Я создаю сводный вид форм Microsoft InfoPath, используя пользовательскую таблицу стилей XSLT.

У меня есть выбор радиокнопок на форме, которые нажимаются "Да", "Нет"

например.

 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.

EDIT

Я также упомянул, что хотел иметь возможность повторно использовать функцию в других ситуациях, таких как

              <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 ]

1 голос
/ 25 июля 2011

Попробуйте это:

<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 или нет.

Обратите внимание, что вы можете расширить тот же принцип, чтобы использовать "и" для последнего элемента вместо запятой, если вы хотите это сделать.

0 голосов
/ 25 июля 2011

Может быть, посмотрите на Внушить .

Тогда вы могли бы сделать

<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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...