Преобразовывать тег, только если последует другой тип тега - PullRequest
0 голосов
/ 09 февраля 2012

Я хотел бы изменить существующий 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

Ответы [ 4 ]

1 голос
/ 09 февраля 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>
1 голос
/ 09 февраля 2012

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

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

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

0 голосов
/ 09 февраля 2012

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

Если это ваш 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
0 голосов
/ 09 февраля 2012

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

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

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

...