2016-07-26 8 views
0

Попытка узнать XSL, я не могу понять это прямо в голове. Скажем, я хочу создать XSLT-шаблон, который обрабатывает узлы на основе их значения. Давайте сделаем ситуацию пример:Разница между пустым узлом и узлом с 0 значением

<data> 
    <item1>0</item1> 
    <item2></item2> 
    <!--Multiple similar nodes below--> 
</data> 

Давайте попробуем отметить пустые с xsi:nil="true", оставив при этом нулевые те быть:

<xsl:template match="node()[starts-with(name(), 'item')]"> 
    <xsl:copy> 
    <xsl:if test="not(node()) and not(.!='')"><!--This is the problem--> 
     <xsl:attribute name="xsi:nil">true</xsl:attribute> 
    </xsl:if> 
    <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
</xsl:template> 

Это действительно делает именно то, что я хочу, чтобы это сделать, но это код монстра Франкенштейна, который я еще не совсем понял.

Теперь, экспериментируя, исследуя StackOverflow и пытается понять это, я обнаружил, что not(node()) можно определить как пустые и нулевое значение узлов, а также .!=0, но .!='' кажется, предназначаться только нулевые узлы значений, которые Безразлично» Для меня смысл.
Мне кажется, что строковые значения могут быть квалифицированы как нулевое значение или нулевые значения как пустые значения строки, но я не могу понять это.

В принципе, вопрос как я могу отличить пустой узел от узла с нулевым значением?

+0

Обнаружили ошибку в примере XSL-кода, она работает сейчас, как и предполагалось, но характер вопроса остается тем же. – twinchenzo

+0

"* Я выяснил, что not (node ​​()) может определять как пустые, так и нулевые узлы значений *« Я так не думаю. –

+0

Вы абсолютно правы, я был в замешательстве, потому что мой код был неисправен и не дал результатов, которые я ожидал. Спасибо, что указали! – twinchenzo

ответ

0

он добавляет XSI: ноль = «истинный» в пустой узел, но он по каким-либо причина удаляет значение ITEM1 из нуля, что делает его пустым.

Это потому, что вы поместили инструкцию:

<xsl:apply-templates select="@* | node()"/> 

в xsl:if заявлении.

В основном, речь идет о как я могу отличить пустой узел от узла с нулевым значением?

Пустой узел не имеет дочерних узлов - элементов, текстовых узлов или любого другого типа узлов (кроме атрибутов). Узел с нулевым значением имеет дочерний текстовый узел со строковым значением «0». Чтобы проверить наличие пустых элементов, достаточно:

<xsl:template match="*[starts-with(name(), 'item')][not(node())]"> 
    <xsl:copy> 
     <xsl:attribute name="xsi:nil">true</xsl:attribute> 
    </xsl:copy> 
</xsl:template> 
+0

Спасибо, Майкл, который разъясняет большинство вещей, которые я не понимал по этому поводу; что касается ошибки в примере, я уже нашел ее, но спасибо за то, что вы указали это. Можете ли вы, пожалуйста, также объяснить мне, что «.! =» Представляет и почему он работает в случае, представленном выше? – twinchenzo

+0

О, неважно, я понял - это не сработало, но первое выражение сработало. И если бы я хотел обработать только узлы с нулевыми значениями, я бы вместо этого использовал 'test = '. =' 0 '" '. Спасибо, я думаю, что я понял это сейчас. – twinchenzo

Смежные вопросы