XSLT: Как изменить родительское имя тега и Удалить атрибут из XML-файла?

Блокнот ++ наверняка

5
задан InfantPro'Aravind' 8 December 2009 в 05:30
поделиться

4 ответа

Ни одно из предложенных решений не решает проблему : они просто переименовывают элемент с именем «Корень» (или даже просто верхний элемент) без проверка наличия у этого элемента атрибута «Id».

wwerner наиболее близок к правильному решению, но переименовывает родительский элемент.

Вот решение, которое имеет следующие свойства :

  • Это правильно.
  • Это коротко.
  • Он является обобщенным (имя замены содержится в переменной).

Вот код:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:variable name="vRep" select="'Batch'"/>

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

  <xsl:template match="@Id"/>

  <xsl:template match="*[@Id]">
    <xsl:element name="{$vRep}">
      <xsl:apply-templates select="node()|@*"/>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>
5
ответ дан 13 December 2019 в 19:29
поделиться
<xsl:template match="@*|node()">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()|text()"/>
  </xsl:copy>
</xsl:template>
<xsl:template match="@Id" />
<xsl:template match="Root">
  <Batch>
    <xsl:copy-of select="@*|*|text()" />
  </Batch>
</xsl:template>
2
ответ дан 13 December 2019 в 19:29
поделиться

Это должно сработать:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
   <xsl:template match="@*|node()">
      <xsl:copy>
         <xsl:apply-templates select="@*|node()|text()" />
      </xsl:copy>
   </xsl:template>

   <xsl:template match="node()[node()/@Id]">
      <batch>
         <xsl:apply-templates select='@*|*|text()' />
      </batch>
   </xsl:template>

   <xsl:template match="@Id">
   </xsl:template>
</xsl:stylesheet>

Я тестировал со следующим вводом XML:

<root anotherAttribute="1">
<a Id="1"/>
<a Id="2"/>
<a Id="3" anotherAttribute="1">
    <b Id="4"/>
    <b Id="5"/>
</a>

2
ответ дан 13 December 2019 в 19:29
поделиться

I would try:

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

The first block copies all that is not specified, as you use. The second replaces @id with nothing wherever is occurs. The third renames /Root to /Batch.

2
ответ дан 13 December 2019 в 19:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: