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

问题描述 投票:0回答:1

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

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

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

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

我想要做到这一点的唯一方法是在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>

任何人都有任何其他方式在一张地图中这样做?

xslt-1.0
1个回答
0
投票

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

<xsl:variable name="out-Node">
  <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>
</xsl:variable>

<xsl:if test="$out-Node != ''">
  <Out>
    <xsl:copy-of select="$out-Node"/>
  </Out>
</xsl:if>

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

© www.soinside.com 2019 - 2024. All rights reserved.