2014-10-28 4 views
1

Я пытаюсь использовать XSLT для преобразования этого:Как добавить счетчик на имена элементов с помощью XSLT

<Parents> 
    <Parent> 
    <ChildA val="bill" /> 
    <ChildB val="tom" /> 
    </Parent> 
    <Parent> 
    <ChildA val="jake" /> 
    <ChildB val="sue" /> 
    </Parent> 
</Parents> 

в этом:

<Parents> 
    <ChildA1 val="bill" /> 
    <ChildB1 val="tom" /> 
    <ChildA2 val="jake" /> 
    <ChildB2 val="sue" /> 
</Parents> 

< ОТКАЗ> Цель XML является а не форму, которую я бы выбрал для любых целей, кроме интеграции с системой, созданной садистскими троллями. К сожалению, теперь я столкнулся с одним из тех (система, то есть не тролль). </ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ>

Я начинаю с сложных элементов, и мне нужно объединить их детей в один длинный список. Числа используются для различения детей друг от друга.

Я знаю, что XSLT может использоваться для преобразования одного элемента <Parent> в его два дочерних элемента. Есть ли способ, которым я мог бы использовать счетчик от XSLT-трансформатора, чтобы автоматически добавлять число?

+0

Если вы хотите написать преобразование для создания ужасно разработанного XML, вы найдете больше друзей, если вы объясните, что знаете, что это ужасный XML, но у вас есть веские причины для этого .... –

+0

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

ответ

3

Ну, если вы используете xsl:number как в

<xsl:template match="Parents/Parent/*"> 
    <xsl:variable name="index"><xsl:number level="any"/></xsl:variable> 
    <xsl:element name="{name()}{$index}"> 
    <xsl:copy-of select="@* | node()"/> 
    </xsl:element> 
</xsl:template> 

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

+0

Относительно "хорошей идеи": совершенно верно. Я добавил заявление об отказе в вопросе. Я попробую это утром. – CSJ

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