XSLT имеет Разделение () функцией?

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

43
задан travis 17 December 2010 в 22:24
поделиться

7 ответов

Используйте рекурсивный метод:

<xsl:template name="output-tokens">
    <xsl:param name="list" /> 
    <xsl:variable name="newlist" select="concat(normalize-space($list), ' ')" /> 
    <xsl:variable name="first" select="substring-before($newlist, ' ')" /> 
    <xsl:variable name="remaining" select="substring-after($newlist, ' ')" /> 
    <id>
        <xsl:value-of select="$first" /> 
    </id>
    <xsl:if test="$remaining">
        <xsl:call-template name="output-tokens">
            <xsl:with-param name="list" select="$remaining" /> 
        </xsl:call-template>
    </xsl:if>
</xsl:template>
52
ответ дан Alex Angas 26 November 2019 в 22:51
поделиться

Если можно использовать XSLT 2.0 или выше, можно использовать tokenize(string, separator):

tokenize("XPath is fun", "\s+")
Result: ("XPath", "is", "fun")

Посмотрите ссылка на функцию w3schools XPath .

По умолчанию.NET не поддерживает XSLT 2.0, уже не говоря о XSLT 3.0. Единственные, известные 2.0 + процессоры для.NET, сакс для.NET с IKVM, Exselt, процессор XSLT 3.0.NET в настоящее время в бета-версии, и процессор XMLPrime XSLT 2.0.

11
ответ дан Abel 26 November 2019 в 22:51
поделиться

Я закончил тем, что использовал substring-after() функция. Вот то, что работало на меня:

<a>
    <xsl:attribute name="href">
        /newpage.aspx?<xsl:value-of select="substring-after(someNode, '?')"/>
    </xsl:attribute>
    Link text
</a>

Даже после установки версии моего XSLT к 2,0, я все еще добрался" 'tokenize()' is an unknown XSLT function." ошибка при попытке использовать tokenize().

8
ответ дан travis 26 November 2019 в 22:51
поделиться

. СЕТЬ не поддерживает XSLT 2.0, к сожалению. Я вполне уверен, что это поддерживает EXSLT, который имеет разделение () функция. Microsoft имеет более старая страница на ее реализации EXSLT.

3
ответ дан James Sulak 26 November 2019 в 22:51
поделиться

XSLT 1.0 не имеет функции разделения по сути, но Вы могли потенциально достигнуть того, что Вы пытаетесь сделать с подстрокой - прежде и подстрокой - после функций.

, С другой стороны, при использовании механизма Microsoft XSLT Вы могли бы использовать встроенный C#.

1
ответ дан Greg Beech 26 November 2019 в 22:51
поделиться

Только для справки, если Вы делаете это с 1,0, и Вам действительно нужно разделение/маркирование, Вам нужно xslt расширения .

1
ответ дан AmbroseChapel 26 November 2019 в 22:51
поделиться

Добавление другой возможности, если ваш шаблонизатор поддерживает EXSLT , тогда вы можете использовать tokenize () из этого.

Например:

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:str="http://exslt.org/strings"
                extension-element-prefixes="str">

...
  <a>
    <xsl:attribute name="href">
      <xsl:text>/newpage.aspx?</xsl:text>
      <xsl:value-of select="str:tokenize(someNode)[2]"/>
    </xsl:attribute>              
  </a>
...
</xsl:stylesheet>
6
ответ дан 26 November 2019 в 22:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: