XSLT3 объединение значений с разделителем - PullRequest
0 голосов
/ 25 мая 2020

Я новичок в XSLT и изо всех сил пытаюсь воспроизвести решение, упомянутое здесь XSL для каждого: как определить последний узел? дольше, чем я готов признать :(

Я установил эту скрипку. https://xsltfiddle.liberty-development.net/naZXVFi

Я надеялся, что смогу использовать только разделитель «значение +», а не select / when xslt tools, как это действительно казалось более идиоматическим c.

  • Я не могу показать разделитель;
  • и я не могу выбрать только потомок навыка, я всегда получаю потомков тоже. То есть я не должен видеть detail в выводе.
  • бонус: не уверен, почему этот метатег не самозакрывается (предупреждение в разделе html)

Желаемый результат: skill1, skill2, skill3, skill4, skill5 (без запятой для последнего)

Любая помощь будет принята с благодарностью. Спасибо.

РЕДАКТИРОВАТЬ: включая сюда код: xml: (нужно добавить ref в xslt):

<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?> <!-- not in fiddle -->

<skills>
    <skill>skill1</skill>
    <skill>skill2</skill>
    <skill>skill3
        <details>
            <detail>detail1</detail>
            <detail>detail2</detail>
        </details>
    </skill>
    <skill>skill4</skill>
    <skill>skill5</skill>
</skills>

и test.xsl:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:math="http://www.w3.org/2005/xpath-functions/math"
    xmlns:map="http://www.w3.org/2005/xpath-functions/map"
    xmlns:array="http://www.w3.org/2005/xpath-functions/array"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:output method="html" indent="yes" html-version="5"/>

  <xsl:template match="/">
    <html>
      <head>
        <title>.NET XSLT Fiddle Example</title>
      </head>
      <body>
         <xsl:for-each select="/skills/skill">
            <xsl:value-of select="." separator=", "/>
        </xsl:for-each>
      </body>
    </html>


  </xsl:template>

</xsl:stylesheet>

Ответы [ 2 ]

1 голос
/ 26 мая 2020

Мартин подробно проработал вас, чтобы получить окончательный результат, включая избавление от лишних пробелов и т.д. c, но на высоком уровне вот как использовать xsl:value-of с separator правильно.

У вас есть:

  <body>
     <xsl:for-each select="/skills/skill">
        <xsl:value-of select="." separator=", "/>
    </xsl:for-each>
  </body>

Это говорит о том, что для каждого узла навыков возьмите содержимое этого узла и отобразите его. Примечательно, что value-of видит только один навык за раз, поэтому нет ничего, что можно было бы объединить с помощью разделителя запятой.

Ответ, который даст вам то, что вы хотите:

  <body>
        <xsl:value-of select="/skills/skill" separator=", "/>
  </body>

Это говорит о том, что нужно взять набор узлов навыков и отобразить их, соединенные запятыми. Вы можете увидеть результат в https://xsltfiddle.liberty-development.net/naZXVFi/4

1 голос
/ 25 мая 2020

Как правило, с XSLT 2/3 для вывода последовательности, разделенной некоторой строкой-разделителем, вы просто используете xsl:value-of select="$sequence" с соответствующей строкой-разделителем в атрибуте separator (и не for-each):

  <xsl:template match="skills">
    <xsl:value-of select="skill/text()[normalize-space()]/normalize-space()" separator=", "/>
  </xsl:template>

https://xsltfiddle.liberty-development.net/naZXVFi/1

В большинстве случаев вам понадобится просто select="skill" separator=", ", но с учетом ваших потомков и пробелов вы, кажется, хотите удалить выражение select выше немного сложнее.

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