XSLT - 如果未映射子元素,则删除输出父元素

时间:2017-08-23 10:03:43

标签: xslt-1.0

想象一下以下架构作为输入

<xs:schema>
  <xs:element name="In">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="InA">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="InA1" type="xs:string" />
              <xs:element name="InA2" type="xs:string" />
              <xs:element name="InA3" type="xs:string" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="InB">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="InB1" type="xs:string" />
              <xs:element name="InB2" type="xs:string" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

例如

<In>
  <InA>
    <InA1>InA1_0</InA1>
    <InA2>InA2_0</InA2>
    <InA3>InA3_0</InA3>
  </InA>
  <InB>
    <InB1>InB1_0</InB1>
    <InB2>InB2_0</InB2>
  </InB>
</In>

现在,我需要将其映射到另一个模式,因为一些规则是:

  • 如果值为!=''
  • ,则从In / InA / InA1映射的Out / Out1
  • 如果值为!=''
  • ,则从In / InB / InB2映射Out / Out2
  • 如果值为!=''
  • ,则从In / InA / InA3映射Out / Out3
  • 只有在至少有一个孩子被映射时才应该出现

我想要这样做的唯一方法就是在Out元素之前做一个if,但是对于孩子Out来说,这是非常乏味和有问题的。

<xsl:if test="/In/InA/InA1 != '' and /In/InA/InB2 != '' and /In/InA/InA3 != ''">
<Out>
  <xsl:if test="/In/InA/InA1 != ''">
  <Out1>
  <xsl:value-of select="/In/InA/InA1/text()">
  </Out1>
  </xsl:if>
  <xsl:if test="/In/InA/InB2 != ''">
  <Out2>
  <xsl:value-of select="/In/InB/InB2/text()">
  </Out2>
  </xsl:if>
  <xsl:if test="/In/InA/InA3 != ''">
  <Out3>
  <xsl:value-of select="/In/InA/InA3/text()">
  </Out3>
  </xsl:if>
</Out>
</xsl:if>

任何人都可以在一张地图中执行此操作吗?

1 个答案:

答案 0 :(得分:0)

这是我出来的。我们的想法是在变量中执行内部映射,然后检查变量是否为空。如果不是,那么我可以映射。

Series ttt = new Series("")
{
    ChartType = SeriesChartType.Line,
    Color = Color.Yellow,
    BorderWidth = 5,
    Font = new Font(Font.OriginalFontName, 20, FontStyle.Regular),
};
ttt.Points.AddXY(0,10);
//ttt.Points.AddXY(0, -10);
this.chart1.Series.Add(ttt);

当然,这种方法必须有问题,我想其中一个就是性能。