2015-10-15 5 views
0

я пытаюсь скопировать все узлы только один раз из документа, используя этот код:исключающих узлов на основе трех атрибутов

<?xml version="1.0"?> 

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()[not(@id = preceding-sibling::node()/@id and @version = preceding-sibling::node()/@version and @lang = preceding-sibling::node()/@lang)]"/> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

Однако этот код делает каждый узел() с тем же идентификатором копироваться только один раз, независимо от того, имеют ли они один и тот же язык и версию или нет.

поэтому, если узел с id = "2" version = "2" и lang = "en" находится над узлом с id = "2" version = "1" и lang = "en", это узел с версией 1 не копируется.

Почему оценивается только одно условие?

+0

Можете ли вы изменить свой вопрос, чтобы показать образец своего XML, и результат, который вы ожидаете в этом случае? Спасибо! –

ответ

1

Обратите внимание, что выражение:

node()[not(@id = preceding-sibling::node()/@id and @version = preceding-sibling::node()/@version and @lang = preceding-sibling::node()/@lang)] 

выбирает любой узел, который не имеет предшествующий родственный с тем же id, и не имеет предшествующий родственный с тем же version, и не имеет предшествующий брат с тем же lang.

Это не то же самое, как узел, который не имеет предшествующую родственный с теми же комбинациями id и version и lang (все три в одном узле).

Я считаю, что использование xsl:for-each-group было бы намного лучшей стратегией для развертывания здесь.

+0

aaah okay ... поэтому каждое условие проверяется индивидуально ... Большое спасибо! – user3813234

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