2013-02-14 1 views
0

Я борюсь с проблемой ниже. Надеюсь, что кто-нибудь из вас предложит или поможет мне решить эту проблему.Изменение предыдущего значения NODE на основе текущего значения узла в xslt

У меня есть полезная нагрузка ниже типа псевдо xsd.

<element name=Main maxCoccurs=unbounded> 
     <complexType> 
      <element name=input1/> 
      <element name=input2/> 
      <element name=input3/> 
      <element name=input4/> 
      <element name=input5/> 
      <element name=inside/> 
       <element name=username/> 
       <element name=address/> 
     </complextype> 
    <element> 

Главное - повторяемый элемент. Я хочу проверить имя пользователя, если значение в имени пользователя всех узлов не равно, тогда мне нужно назначить пустое значение имени пользователя первого узла.

Как я могу это сделать при трансформации?

Я пытаюсь сделать это, как показано ниже: получить имя пользователя firt в переменной, а затем проверить, что все имена пользователей используются для каждого. , если он не равен .... Но я не могу присвоить пустое значение первому узлу, так как я где-то в имени пользователя n-го узла.

Я думал об использовании переменной, чтобы сказать unmatched = true(), но xslt can not позволяет нам внести изменения в переменную после объявления. Так что даже этот вариант исключен.

Как я могу достичь этого? Помогите мне решить это.

Надеюсь, что я поняла.

Приветствия Чандру

+0

Использование XSLT 1.0 или XSLT 2.0? –

+0

Вы отметили это как xslt 1.0 и 2.0 - какой из них вы действительно хотите? –

ответ

0

Предполагая foo это имя родительского элемента из main элементов можно использовать

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

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

<xsl:template match="foo[some $m in main satisfies $m/username != main/username]/main[1]/username"> 
    <xsl:copy/> 
</xsl:template> 

</xsl:stylesheet> 

Вот некоторые ввода пробы:

<root> 
    <foo> 
    <main> 
     <input1/> 
     <input2/> 
     <input3/> 
     <input4/> 
     <input5/> 
     <inside/> 
     <username>u1</username> 
     <address/> 
    </main> 
    <main> 
     <input1/> 
     <input2/> 
     <input3/> 
     <input4/> 
     <input5/> 
     <inside/> 
     <username>u1</username> 
     <address/> 
    </main> 
    <main> 
     <input1/> 
     <input2/> 
     <input3/> 
     <input4/> 
     <input5/> 
     <inside/> 
     <username>u2</username> 
     <address/> 
    </main> 
    <main> 
     <input1/> 
     <input2/> 
     <input3/> 
     <input4/> 
     <input5/> 
     <inside/> 
     <username>u1</username> 
     <address/> 
    </main> 
    </foo> 
</root> 

Когда таблица стилей применяется с Saxon 9.4, выход, который я получаю, равен

<root> 
    <foo> 
    <main> 
     <input1/> 
     <input2/> 
     <input3/> 
     <input4/> 
     <input5/> 
     <inside/> 
     <username/> 
     <address/> 
    </main> 
    <main> 
     <input1/> 
     <input2/> 
     <input3/> 
     <input4/> 
     <input5/> 
     <inside/> 
     <username>u1</username> 
     <address/> 
    </main> 
    <main> 
     <input1/> 
     <input2/> 
     <input3/> 
     <input4/> 
     <input5/> 
     <inside/> 
     <username>u2</username> 
     <address/> 
    </main> 
    <main> 
     <input1/> 
     <input2/> 
     <input3/> 
     <input4/> 
     <input5/> 
     <inside/> 
     <username>u1</username> 
     <address/> 
    </main> 
    </foo> 
</root> 

где username первого main пусто теперь, потому что есть один main с username, который отличается от других.

Я немного смущен, так как ответ принят, но в комментарии говорится, что вам нужно решение XSLT 1.0. Я приведу таблицу стилей XSLT 1.0 ниже:

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

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

<xsl:template match="foo[main[username != ../main/username]]/main[1]/username"> 
    <xsl:copy/> 
</xsl:template> 

</xsl:stylesheet> 
+0

Спасибо всем за ваши ответы. Я удалил xslt 1.0 tag сейчас. @ Мартин, я считаю, что вам трудно понять ваше решение. Это нормально с тобой, чтобы немного попотеть. – user2071463

+0

Вы сказали: «Я хочу проверить имя пользователя, если значение в имени пользователя всех узлов не равно, тогда мне нужно назначить пустое значение имени пользователя первого узла». Для меня с XSLT 2.0, который «переводит» на запись шаблона для дочернего элемента «username» первого элемента 'main' (' main [1] '), если условие выполнено. Но я думаю, что я написал неверную проверку предикатов с помощью 'not (=)'. Я отредактирую и предоставил образец проверенного кода. –

+0

Большое спасибо Мартин ... Прошу прощения, поскольку версия xslt 1.0, а не 2.0. Я попробовал решение, которое вы мне предоставили, но, к сожалению, он не работал для меня .. :( – user2071463

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