Преобразовывать тег только в том случае, если за ним последует другой тип тега

Я хотел бы изменить существующий файл xsl, чтобы тег <Empty> в исходном документе преобразовывался только в том случае, если за ним последует другой родственный элемент, который не является этим тегом. Своего рода усечение этих тегов до конца.

В настоящее время у меня есть:

...
<xsl:template match="Expression">
    <xsl:value-of select="."/>
</xsl:template>
<xsl:template match="Empty">
    <xsl:value-of select="."/>
</xsl:template>

Можно ли этого добиться с помощью xslt?

Пример ввода

<root>
  <dummy1>Test1</dummy1>
  <Empty>Empty1</Empty>
  <Empty>Empty2</Empty>
  <dummy2>Test2</dummy2>
  <Empty>Empty3</Empty>
  <Empty>Empty4</Empty>
  <Empty>Empty5</Empty>
</root>

желаемый результат: Test1Empty1Empty2Test2


person stracktracer    schedule 09.02.2012    source источник


Ответы (4)


Я добавляю новый ответ ..

Если это ваш XML:

<?xml version="1.0" encoding="utf-8"?>
<root>
  <dummy>test</dummy>
  <Empty>copy-this</Empty>
  <Empty>copy-this1</Empty>
  <dummy>test</dummy>
  <Empty>copy-this</Empty>
  <Empty>copy-this1</Empty>
  <dummy>test</dummy>
  <Empty>donot-copy-this2</Empty>
  <Empty>donot-copy-this2</Empty>
</root>

XSLT: пример кода..

  <xsl:template match="dummy">
    <xsl:value-of select="."/>
  </xsl:template>
  <xsl:template match="Empty[following-sibling::*[name()!='Empty']]">
    <xsl:value-of select="."/>
  </xsl:template>
  <xsl:template match="text()"/>

Выход:

testcopy-thiscopy-this1testcopy-thiscopy-this1test
person InfantPro'Aravind'    schedule 09.02.2012

Опубликуйте небольшой входной образец и соответствующий результат, который вы хотите создать с помощью XSLT. В XPath есть родственная ось, поэтому, например.

<xsl:template match="Empty[following-sibling::*[1][not(self::Empty)]]">
  <!-- now transform here as needed -->
</xsl:template>

соответствует любым элементам Empty, за которыми следует другой элемент, не являющийся элементом Empty, но я не уверен, что это все, что вам нужно и что вы хотите делать внутри шаблона.

person Martin Honnen    schedule 09.02.2012

Предполагаемый входной XML как:

<?xml version="1.0" encoding="utf-8"?>
<root>
  <dummy1>test</dummy1>
  <Empty>do-not-copy</Empty>
  <Empty>copy-this1</Empty>
  <dummy2>test</dummy2>
  <Empty>do-not-copy-this2</Empty>
</root>

В приведенном выше XML .. 2-й элемент <Empty>do-not-copy</Empty> имеет ближайший соседний элемент как <Empty>copy-this1</Empty>, поэтому его не следует выбирать. где за 3-м элементом следует <dummy2/>, поэтому его следует скопировать ..
и 5-й элемент <Empty>copy-this2</Empty>, за ним не следует никакой тег .. поэтому его также следует удалить :)

это код XSL для этого:

  <xsl:template match="Empty[following-sibling::*[1][name()!='Empty']]">
    <xsl:value-of select="."/>
  </xsl:template>
person InfantPro'Aravind'    schedule 09.02.2012
comment
Кажется, что это неправильно понято: последний пустой тег следует игнорировать, потому что нет другого следующего за ним тега, отличного от пустого. - person stracktracer; 09.02.2012
comment
@stracktracer, чувак, <Empty>Empty1</Empty> не копируется, потому что за ним следует <Empty>Empty2</Empty> .. Согласно твоему требованию его не следует копировать .. - person InfantPro'Aravind'; 09.02.2012
comment
Где ты это читаешь? Я прочитал, и я имел в виду только распечатать содержимое <Empty>, если за ним следуют другие типы тегов в качестве братьев и сестер. Я разместил рабочую альтернативу в качестве другого ответа. - person stracktracer; 09.02.2012
comment
@stracktracer, о! Наконец-то я понял ваше требование ... о, отредактируйте ответ ... вместе с надежным xml. - person InfantPro'Aravind'; 09.02.2012

Я изменил предлагаемые решения на следующее:

<xsl:template match="Empty[following-sibling::*[not(self::Empty)]]">
    <xsl:value-of select="."/>
</xsl:template>

который, кажется, работает.

person stracktracer    schedule 09.02.2012