XSL Изменить значение элемента из другого элемента - PullRequest
0 голосов
/ 28 сентября 2018

Я хочу иметь возможность изменить значение элемента A из шаблона элемента B

XML-ввод

<Parent>
   <Elem1 Attr="Something" OtherAttr="Other">ExistingValue</Elem1>
   <Elem2 Attr="SomethingElse" />
</Parent>

XSL

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

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

<xsl:template match="Elem1">
   <!-- SOMEHOW MODIFY HERE VALUE OF ELEM2 -->
</xsl:template>
</xsl:stylesheet>

Ожидаемый вывод XML

<Parent>
 <Elem1 Attr="Something" OtherAttr="Other">ExistingValue</Elem1>
 <Elem2 Attr="SomethingElse">Value from elem1</Elem2>
</Parent>

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

Вот одна идея.

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

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

  <xsl:apply-templates select="//Elem2" mode="outElem2">
    <xsl:with-param name="Elem1Attr" select="@Attr"/>
    <!-- You could also pass the value from Elem1 here. -->
  </xsl:apply-templates>
</xsl:template>

<!-- Suppress Elem2-->
<xsl:template match="Elem2"/>

<!--**** outElem2 mode. -->  
<xsl:template match="node() | @*" mode="outElem2">
  <xsl:param name="Elem1Attr"/>
  <xsl:copy>
    <xsl:apply-templates select="node() | @*" mode="outElem2">
      <xsl:with-param name="Elem1Attr" select="@Attr"/>
    </xsl:apply-templates>
  </xsl:copy>
</xsl:template>

<xsl:template match="Elem2" mode="outElem2">
  <xsl:param name="Elem1Attr"/>
  <xsl:copy>
    <!-- Output the attributes. -->
    <xsl:apply-templates select="@*" mode="outElem2"/>

    <xsl:choose>
      <xsl:when test="$Elem1Attr = 'Something'">
        <xsl:value-of select="'Value from elem1'"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="'Something else'"/>
      </xsl:otherwise>
    </xsl:choose> 
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>
0 голосов
/ 28 сентября 2018

Вы не можете "изменить" вещи в XSLT.Ваша таблица стилей принимает XML-документ в качестве входных данных и создает другой XML-документ в качестве выходных данных.Лучше всего рассматривать вашу таблицу стилей как последовательную запись выходных данных, получая доступ к любой части входных данных, которая необходима для создания каждого элемента результата при его создании.Единственный раз, когда вы можете установить значение элемента E, это когда вы пишете элемент E. (Это чрезмерно ориентированная на время картина происходящего, но это полезная ментальная модель.)

В вашем примере,код для установки значения Elem2 обычно принадлежит правилу шаблона для Elem2.

...