XSLT_1:根据子元素值添加丢失的节点

时间:2019-01-12 17:06:54

标签: xslt-1.0

可以请您协助以下解决方法。

有时,源文件缺少孔段(具有编号为3的子'count'元素)。在这种情况下,我需要映射所有丢失的节点段并添加一些特定值。

请在下面查看包含所有“节点”段的正确的源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>

组成部分是:

<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>

如果存在具有子元素“ count” = 3的元素“ node”,则按原样映射。

否则输出将是:

<?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 :(得分:0)

不是很简单吗?

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>