Замените имя элемента XML значением атрибута в любом месте - PullRequest
0 голосов
/ 05 июня 2018

У меня есть рабочий XSLT, который заменяет имя элемента значением атрибута, только когда атрибут называется «AttributeID».Он сохраняет исходное имя элемента в новом атрибуте с именем StepClass, но работает только на одном уровне.

Этот XML:

<Products>
  <Product>
    <Values>
      <Value AttributeID="One">1</Value>
      <MultiValue AttributeID="Multi1">
        <Value>111</Value>
      </MultiValue>
    </Values>
  </Product>
</Products>

Становится следующим XML:

 <Products>
  <Product>
    <Values>
      <One StepClass="Value">1</One>
      <Multi1 StepClass="MultiValue">
        <Value>111</Value>
      </Multi1>
    </Values>
  </Product>
</Products>

Использование этого XSLT:

<?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:strip-space elements="*"/>

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

  <!-- Change Values/Value value of AttributeID -->
  <!--  <xsl:template match="Values/Value|MultiValue|MetaData/Value">  This was working with 1 level -->
    <xsl:template match="*[@AttributeID]">
    <xsl:element name="{@AttributeID}">
    <xsl:attribute name="StepClass">
      <xsl:value-of select="name()" />
    </xsl:attribute>      
        <xsl:apply-templates select="@*|node()"/>
    </xsl:element>
  </xsl:template>

  <!--empty template suppresses this attribute-->
  <xsl:template match="@AttributeID" />

</xsl:stylesheet>

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

Вложенный XML:

<Products>
  <Product>
    <Values>
      <Value AttributeID="One">1</Value>
      <MultiValue AttributeID="Multi1">
        <Value>111</Value>
      </MultiValue>
    </Values>
    <Product>
      <Values>
        <Value AttributeID="Two">2</Value>
        <MultiValue AttributeID="Multi2">
          <Value>222</Value>
        </MultiValue>
      </Values>
    </Product>
  </Product>
</Products>

1 Ответ

0 голосов
/ 05 июня 2018

XSLT, как показано в сообщении, работает как положено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...