XSLT_1: добавить отсутствующий узел на основе значения дочернего элемента - PullRequest
0 голосов
/ 12 января 2019

Не могли бы вы помочь с решением ниже.

Исходные файлы иногда пропускают отсутствующий сегмент отверстия (, который имеет дочерний элемент 'count' с номером 3 ). В этом случае мне нужно отобразить весь отсутствующий сегмент узла и добавить некоторые конкретные значения.

Пожалуйста, смотрите правильный исходный XML-файл ниже, который имеет все сегменты 'узла'.

<?xml version="1.0" encoding="utf-8"?>
<root>
  <group>
    <node segment="1">
      <count>2</count>
      <value>value_2</value>
    </node>
    <node segment="1">
      <count>3</count>
      <value>value_3</value>
    </node>
    <node segment="1">
      <count>1</count>
      <value>value_1</value>
    </node>
  </group>
</root>

В приведенном ниже не все сегменты на месте.

<?xml version="1.0" encoding="utf-8"?>
    <root>
      <group>
        <node segment="1">
          <count>2</count>
          <value>value_2</value>
        </node>
        <node segment="1">
          <count>1</count>
          <value>value_1</value>
        </node>
      </group>
    </root>

Mising часть:

<node segment="1">
   <count>3</count>
   <value>value_3</value>
</node>

Я работал над сценарием xslt ниже, который не дает мне правильных результатов вывода. Пожалуйста, помогите

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

  <xsl:template match="root/group[not(node/count='3')]">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
        <node>
          <count><xsl:value-of select="'some_results'"></xsl:value-of></count>
          <value><xsl:value-of select="'some_results'"/></value>
        </node>
      <xsl:apply-templates select="node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="node[not(count='3')]">
    <xsl:copy>
      <xsl:apply-templates select="@*"/>
      <count><xsl:value-of select="count"></xsl:value-of></count>
      <value><xsl:value-of select="value"/></value>
      <xsl:apply-templates select="node()"/>
    </xsl:copy>
  </xsl:template>

Если элемент 'node', у которого есть дочерний элемент 'count' = 3, присутствует - отобразите как есть.

В противном случае вывод будет:

<?xml version="1.0" encoding="utf-8"?>
<root>
  <group>
    <node segment="1">
      <count>2</count>
      <value>value_2</value>
    </node>
    <node segment="1">
      <count>some_results</count>
      <value>some_results</value>
    </node>
    <node segment="1">
      <count>1</count>
      <value>value_1</value>
    </node>
  </group>
</root>

Спасибо, Дарий

1 Ответ

0 голосов
/ 12 января 2019

Не может быть просто:

XSLT 1.0

<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="group[not(node/count='3')]">
    <xsl:copy>
        <!-- add missing node-->
        <node segment="1">
            <count>some_results</count>
            <value>some_results</value>
        </node>
        <!-- process existing nodes -->
        <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>
...