如何在XSLT中检查字段值并使用if进行比较?

时间:2018-02-27 20:13:09

标签: xml xslt

XSD文件:

<xs:element name="Header">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="MessageHeader">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="demoName" type="xs:string" />
             <xs:element name="purpose">
              <xs:complexType>
                <xs:sequence>
                  <xs:element maxOccurs="unbounded" name="purposeMessage">
                    <xs:complexType>
                      <xs:sequence>                               
                        <xs:element name="unit" type="xs:string" />
                      </xs:sequence>
                    </xs:complexType>
                  </xs:element>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>

我想检查输入XML文件中是否存在元素purpose 如果它存在,那么我想要取其价值,如果不是,那么我想忽略它的价值。

我在下面试过,但它不起作用。

XSLT:

<Header>
    <MessageHeader>
        <xsl:for-each select="field[@name= 'Header']/object[@class='com.demo.ttt.xml.MessageHeader']/field">
            <xsl:variable name="var:varValue" select="value/text()" />
            <xsl:if test="string($var:varValue) = 'purpose'">
                <xsl:element name="{@name}" >
                    <xsl:value-of select="$var:varValue" />
                </xsl:element>

            </xsl:if>
        </xsl:for-each>
    </MessageHeader>
</Header>

输入XML:

<?xml version="1.0" encoding="UTF-16" standalone="yes"?>
<field name="Header">
    <object class="com.demo.ttt.xml.MessageHeader">
        <field name="demoName">
            <value class="java.lang.String"/>
        </field>
        <field name="purpose">
            <array class="com.demo.ttt.xml.purposeMessage" length="1" level="1">
                <object class="com.demo.cce.eai.condition.xml.purposeMessage">
                    <field name="unit">
                        <value class="java.lang.String">Z01</value>
                    </field>                        
                </object>
            </array>
        </field>
    </object>    <!-- added by edit -->
</field>         <!-- added by edit -->

purposeMessage是具有多个元素的数组,所以我需要再使用一个内部,如果条件如何做到这一点?

预期产出是 -

<Header>
  <MessageHeader>
    <purpose><unit>Z01</unit></purpose>
  </MessageHeader>
</Header>

如果目的有多个元素,那么它将在

中创建多个元素

1 个答案:

答案 0 :(得分:1)

如果<value>元素的<purpose>属性具有值{{},则以下XSLT-1.0解决方案将@name子元素的文本值包装在<field>元素中{1}}。每个purpose都会创建一个自己的条目作为<object>元素的子项。

因此,代码将创建所需的输出,而不是使用<purpose>,而是使用一组模板,每个模板都符合特定情况:

for-each

输出为:

<!-- removes <field name="demoName"> from the XML -->
<xsl:template match="field[@name = 'demoName']" priority="1" />   

<xsl:template match="field" >
    <xsl:element name="{@name}">
        <xsl:apply-templates />
    </xsl:element>   
</xsl:template>     

<xsl:template match="field[value]" >
    <xsl:element name="{@name}">
        <xsl:value-of select="value/text()" />
    </xsl:element>   
</xsl:template>       

<xsl:template match="object[@class='com.demo.ttt.xml.MessageHeader']" >
    <MessageHeader>
        <xsl:apply-templates />  
    </MessageHeader>
</xsl:template>       

<xsl:template match="array" >
    <xsl:apply-templates />  
</xsl:template> 

编辑:更改了整个模板集。