2013-12-03 1 views
4

У меня проблема с xml и xslt, о которой я не знаю, как решить, и был бы признателен за любую помощь в этом вопросе, с чего начать. У меня есть XML:Скопируйте узел и добавьте значение в атрибут с Xslt

<root> 
<test value="1" setting="3"> 
    <tag1>data....</tag1> 
    <tag2>data....</tag2> 
    <tag n+1>data....</tag n+1> 
</test> 
<test value ... 
. 
. 
. 
</test> 
</root> 

Теперь я бы сейчас нужно скопировать, все узлы в узле «тест» таким образом и добавить всегда значение 3 настройки (значение параметров меняется в тестовом узле) в 4-х новых узлов как показано ниже, так что я хотел бы получить:

<root> 
<test value="2" setting="6"> 
    <ni1 name="1" setting1="6">data....</ni1> 
    <ni2 name="1" setting1="6">data....</ni2> 
    <ni3 name="1" setting1="6">data....</ni3> 
    <ni4 name="1" setting1="6">data....</ni4> 
    <tag1>data....</tag1> 
    <tag2>data....</tag2> 
    <tag n+1>data....</tag n+1> 
</test> 
<test value ... 
. 
. 
. 
</test> 
</root> 

Спасибо большое за любую помощь по этому вопросу, eoglasi

+2

Вы задали ряд очень подобные вопросы в течение последних нескольких дней/недель, по линии «Я хочу, чтобы скопировать большую часть своего входного XML как есть, но добавить/удалить/изменить некоторые конкретные узлы в пределах это ", и ответ всегда был тем же - начните с шаблона идентификации, а затем укажите конкретные шаблоны для битов, которые вы хотите изменить. То же самое верно и здесь, поэтому я уверен, что вы можете очень хорошо решить это. –

+1

Если вы застряли в проблеме _specific_, тогда обязательно отправьте вопрос, включая XSLT, который вы пробовали до сих пор, и (правильно сформированный) пример ввода и вывода, который вам нужен, и мы можем помочь вам отладить его, но вопрос после вопроса, где вы не даете никаких доказательств того, что вы приложили все усилия, начинает утомиться ... –

+0

@ Я, я только начал изучать свой путь вокруг Xslt и что возможно с ним на первом месте. Я всегда делаю исследование, как можно что-то сделать, но когда я застрял, я прошу помочь здесь, в stackoverflow, поскольку вы, ребята, действительно очень помогли мне. Если вы являетесь администратором, не стесняйтесь удалять все сообщения, которые, по вашему мнению, не соответствуют требованиям stackoverflow - я не буду возражать. Спасибо, в любом случае. – eoglasi

ответ

11

Как уже упоминалось в комментариях identity transform является то, что вам нужно, когда вы преобразования XML и только хотите внести изменения в определенные части из XML

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

Вы говорите, что вы хотите «добавить всегда значение 3 настройки», так что вы бы иметь шаблон, соответствующий настройки атрибута.

<xsl:template match="test/@setting"> 

(В данном случае, это будет соответствовать только настройки атрибут, который принадлежит к тест элемента.)

И тогда в этом шаблоне вы затем использовать XSL: атрибут для вывода новый атрибут, а не с тем же именем, но с измененным значением

<xsl:attribute name="setting"> 
    <xsl:value-of select="number(.) + 3" /> 
</xsl:attribute> 

вы говорите, что вы хотите скопировать 4 узла под тест узел. Это означает, что вам нужен шаблон, чтобы соответствовать тест узел, как это то, что вам нужно преобразовать, чтобы добавить детей

<xsl:template match="test"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*" /> 
    <!-- Add new nodes here --> 
    <xsl:apply-templates select="node()"/> 
    </xsl:copy> 
</xsl:template> 

Не ясно, где данные для ваших новых узлов приходит, так что вы будете иметь сделать это самостоятельно, но это похоже на то, что атрибут атрибут исходит из атрибута на тестовом элементе. Таким образом, ваш код может быть таким:

<ni1 name="1" setting1="{number(@setting) + 3}">data....</ni1> 

Обратите внимание на использование шаблонов значений атрибутов здесь. Фигурные фигурные скобки { } указывают выражение, которое должно оцениваться, а не выводиться буквально.

Попробуйте этот XSLT в качестве образца.

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="test/@setting"> 
    <xsl:attribute name="setting"> 
     <xsl:value-of select="number(.) + 3" /> 
    </xsl:attribute> 
    </xsl:template> 

    <xsl:template match="test"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*" /> 
     <ni1 name="1" setting1="{number(@setting) + 3}">data....</ni1> 
     <xsl:apply-templates select="node()"/> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Опять идеальный 10-й ответ с углубленным объяснением: D спасибо много. Можете ли вы порекомендовать несколько хороших книг на xslt? – eoglasi

+1

Проверьте эту ссылку http://stackoverflow.com/questions/3492529/a-good-resource-for-learning-xsl, а затем начните читать .... –

+0

Мое дело было другим, но с помощью {} мне удалось передать атрибуты. Кажется, что это недокументировано! –