XSLT 2.0, как проверить положение () в tokenize () на выходе - PullRequest
0 голосов
/ 23 октября 2018

В XSLT 2.0 у меня есть параметр, который входит в виде строки имен документов с разделителями, например: ms609_0080.xml~ms609_0176.xml~ms609_0210.xml~ms609_0418.xml

I tokenize() этой строки и циклически перебирайте ее с xsl:for-each для передачи каждого документа вkey.Затем результаты из ключа я собираю в строку с разделителями-запятыми для вывода на экран.

<xsl:variable name="list_of_corresp_events">
   <xsl:variable name ="tokenparam" select="tokenize($paramCorrespdocs,'~')"/>
   <xsl:for-each select="$tokenparam">
      <xsl:choose>
          <xsl:when test=".[position() != last()]">
               <xsl:value-of select="document(concat($paramSaxondatapath, .))/(key('correspkey',$correspid))/@xml:id"/>
          </xsl:when>
          <xsl:otherwise>
               <xsl:value-of select="concat(document(concat($paramSaxondatapath, .))/(key('correspkey',$correspid))/@xml:id, ', ')"/>
          </xsl:otherwise>
      </xsl:choose>
   </xsl:for-each>
</xsl:variable>

Все работает нормально, за исключением того, что когда я вывожу переменную $list_of_corresp_events, она выглядит следующим образом, с неожиданной запятой:

ms609-0080-2, ms609-0176-1, ms609-0210-1, ms609-0418-1,

Обычнопоследняя запятая не должна появляться на основе test=".[position() != last()]"?Возможно, позиции не работают для токенизированных данных?Я не видел способа применить string-join() к этому.

Большое спасибо.

Ответы [ 3 ]

0 голосов
/ 24 октября 2018

Улучшение решения от @ zx485, попробуйте

<xsl:for-each select="$tokenparam">
   <xsl:if test="position()!=1">, </xsl:if>
   <xsl:value-of select="document(concat($paramSaxondatapath, .))/(key('correspkey',$correspid))/@xml:id"/>
</xsl:for-each>

Две вещи здесь:

(a) вам не нужно повторять один и тот же код в обеих условных ветвях

(b) более эффективно выводить разделитель запятой перед каждым элементом, кроме первого, а не после каждого элемента, кроме последнего.Это потому, что оценка last() требует дорогостоящего прогнозирования.

0 голосов
/ 24 октября 2018

Кажется, вы можете упростить это до

<xsl:variable name="list_of_corresp_events">
   <xsl:value-of select="for $t in tokenize($paramCorrespdocs,'~') document(concat($paramSaxondatapath, $))/(key('correspkey',$correspid))/@xml:id" separator=", "/>
</xsl:variable>

или с string-join

<xsl:variable name="list_of_corresp_events" select="string-join(for $t in tokenize($paramCorrespdocs,'~') document(concat($paramSaxondatapath, $))/(key('correspkey',$correspid))/@xml:id, ', ')"/>
0 голосов
/ 24 октября 2018

Измените

<xsl:when test=".[position() != last()]">

на

<xsl:when test="position() != last()">

Тогда все должно работать как нужно.

...