Входной XML:
<?xml version = "1.0" encoding = "UTF-8"?>
<Root>
<Entry>
<Tag1>A1</Tag1>
<Tag2>B1</Tag2>
</Entry>
<Entry>
<Tag1>A2</Tag1>
<Tag2/>
</Entry>
</Root>
XSLT:
<?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"
exclude-result-prefixes = "xs"
version = "3.0">
<xsl:output method = "text"/>
<xsl:mode on-no-match = "shallow-skip" streamable = "yes" use-accumulators = "#all"/>
<xsl:accumulator name = "Tag2" as = "xs:string"
initial-value = "''" streamable = "yes">
<xsl:accumulator-rule match = "Tag2/text()"
select = "." />
</xsl:accumulator>
<xsl:template match = "/*" expand-text = "yes">
<xsl:apply-templates/>
Tag2 {accumulator-after('Tag2')}
</xsl:template>
</xsl:stylesheet>
Выход:
Tag2 B1
Я ожидаю вывода как Tag2 <<empty>>, поскольку у второго элемента не определено значение для Tag2.
Можно ли как-нибудь проверить и убедиться, что аккумулятор учитывает случаи, когда для узла нет значения?
Вы сопоставляете узлы text(), в пустом элементе нет текстового узла
Добавьте правило, соответствующее элементу, который устанавливает значение пустой строки.





Вы сопоставляете узлы text(), в пустом элементе нет текстового узла.
Добавьте правило, соответствующее элементу, который устанавливает значение пустой строки:
<xsl:accumulator name = "Tag2" as = "xs:string"
initial-value = "''" streamable = "yes">
<xsl:accumulator-rule match = "Tag2" select = "''"/>
<xsl:accumulator-rule match = "Tag2/text()"
select = "." />
</xsl:accumulator>
Я думаю, что, вероятно, предполагалось match = "Entry", а не match = "Tag". Или возможно match = "Tag2", в зависимости от того, какой именно эффект вы хотите.
@MichaelKay, спасибо, я хотел написать Tag2, сейчас исправил.
@aj2288, приятно слышать. Подумайте о том, чтобы принять ответ, чтобы ваш вопрос был помечен как решенный.
К вашему сведению: я подготовил приведенный выше фрагмент, ссылаясь на stackoverflow.com/questions/48983320/…