Как я могу изменить атрибут в родительском узле?

Это блок XML:

<Object type="proto">
    <Name value="test1"/>
    <Enabled value="1"/>
    <System value="active"/>
    <Time value="10"/>
</Object>
<Object type="proto">
    <Name value="test2"/>
    <Enabled value="1"/>
    <System value="active"/>
    <Time value="20"/>
</Object>

Как изменить значение "Время" только для "test1" во время копирования?

1 ответ

Решение

Это один из возможных способов:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
    <xsl:output method="xml" indent="yes"/>

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

    <xsl:template match="Object[Name/@value='test1']/Time">
      <xsl:copy>
        <xsl:attribute name="value">30</xsl:attribute>
      </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

Краткое объяснение относительно xsl:templates используется:

  • <xsl:template match="@* | node()">...: Шаблон идентичности; копирует узлы и атрибуты в выходной XML без изменений.
  • <xsl:template match="Object[Name/@value='test1']/Time">...: Переопределяет шаблон идентичности для <Time> элемент, который является прямым потомком <Object> иметь ребенка Name/@value равняется test1, Этот шаблон копирует соответствующие <Time> элемент и изменить атрибут value в 30,
Другие вопросы по тегам