У меня есть следующий вопрос относительно преобразования XSLT. Мне нужно преобразовать XML-файл с учетом значений атрибутов во всех родительских узлах до корня. Так имея такой код (рассмотрим атрибут XY в виде строки со значениями «X, Y»):Преобразование XSLT в attibute
<Layout XY="40,20">
<Layout XY="0,20">
<Circle OffsetX="0"/>
</Layout>
<Circle OffsetX="6" />
<Layout XY="100,20">
<Circle OffsetX="0"/>
<Layout XY="200,20">
<Circle OffsetX="5"/>
</Layout>
</Layout>
</Layout>
мне нужен выходной сигнал
<Layout XY="40,20">
<Layout XY="0,20">
<Circle OffsetX="40"/>
</Layout>
<Circle OffsetX="46" />
<Layout XY="100,20">
<Circle OffsetX="140"/>
<Layout XY="200,20">
<Circle OffsetX="345"/>
</Layout>
</Layout>
</Layout>
Я пытаюсь использовать XSLT преобразования используя шаблон, подобный этому:
<!-- Copy template -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- Change values -->
<xsl:template match="Circle/@OffsetX">
<xsl:param name="newOffsetX" select="substring-before(../../@XY,',')"/>
<xsl:apply-templates select="@*|node()"/>
<xsl:attribute name="OffsetX">
<xsl:value-of select=".+$newOffsetX"/>
</xsl:attribute>
</xsl:template>
но это решение только на один уровень вверх. Возможно ли вообще сделать такое преобразование только с использованием XSLT?
"* но это решение только для одного уровня вверх *" На самом деле, это не работает вообще. Родитель атрибута «OffsetX» является самим элементом Circle, поэтому выражение «../@ XY» ничего не выбирает, а результатом добавления является «NaN». –
О, да, извините - это должно быть «substring-before (../../@ XY, ',')« Я опустил выбор бабушки и дедушки этого атрибута - не на prupose – zaxik