Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. Используйте рекурсивный метод:
<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>
Если можно использовать 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.
Я закончил тем, что использовал 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()
.
. СЕТЬ не поддерживает XSLT 2.0, к сожалению. Я вполне уверен, что это поддерживает EXSLT, который имеет разделение () функция. Microsoft имеет более старая страница на ее реализации EXSLT.
XSLT 1.0 не имеет функции разделения по сути, но Вы могли потенциально достигнуть того, что Вы пытаетесь сделать с подстрокой - прежде и подстрокой - после функций.
, С другой стороны, при использовании механизма Microsoft XSLT Вы могли бы использовать встроенный C#.
Только для справки, если Вы делаете это с 1,0, и Вам действительно нужно разделение/маркирование, Вам нужно xslt расширения .
Добавление другой возможности, если ваш шаблонизатор поддерживает 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>