从XSLT 1.0输出中省略空元素

时间:2018-06-07 07:51:01

标签: xml xslt xslt-1.0 transform

我正在使用XSLT 1.0将XML文档转换为不同的XML模式。源文档可能有也可能没有元素,具体取决于它构建的源数据库。

EG

   <Patients>
        <Patient id="1019">
            <Surname>Acqua</Surname>
            <Forenames>Matthew James</Forenames>
            <VoicePhone>0111 222 33333</VoicePhone>
        </Patient>
        <Patient id="1020">
            <Surname>Red</Surname>
            <Forenames>James Alan</Forenames>
        </Patient>
    </Patients>

通过XML转换后得到的输出将包含空元素,因为第二个患者中的VoicePhone不存在(而不是存在但是为空)。

XSLT就是这样的:

<xsl:template match="//Patients/Patient">
<PatientRxs>
  <PatientInfo>
    <FirstName>
      <xsl:value-of select="Forenames"/>
    </FirstName>
    <Telephone>
      <xsl:value-of select="VoicePhone"/>
    </Telephone>
  </PatientInfo>
</PatientRxs>
</xsl:template>

我最终得到了:

<PatientRxs>
    <PatientInfo>
        <FirstName>Matthew James</FirstName>
        <Telephone>0111 222 33333</Telephone>
    </PatientInfo>
</PatientRxs>
<PatientRxs>
    <PatientInfo>
        <FirstName>James Alan</FirstName>
        <Telephone/>
    </PatientInfo>
</PatientRxs>

我真正想要的地方:

<PatientRxs>
    <PatientInfo>
        <FirstName>Matthew James</FirstName>
        <Telephone>0111 222 33333</Telephone>
    </PatientInfo>
</PatientRxs>
<PatientRxs>
    <PatientInfo>
        <FirstName>James Alan</FirstName>
    </PatientInfo>
</PatientRxs>

虽然我可以测试该值是否存在,但这只是源文档中可能不存在的数百个元素中的一个,并且希望避免使用XSLT表来测试每一个

3 个答案:

答案 0 :(得分:0)

尝试使用与任何元素匹配的通用模板,但需要一个参数以允许重命名该元素

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

  <xsl:output method="xml" indent="yes" />
  <xsl:strip-space elements="*" />

  <xsl:template match="//Patients/Patient">
    <PatientRxs>
      <PatientInfo>
        <xsl:apply-templates select="Forenames" mode="field">
          <xsl:with-param name="newName" select="'FirstName'" />
        </xsl:apply-templates>
        <xsl:apply-templates select="VoicePhone" mode="field">
          <xsl:with-param name="newName" select="'Telephone'" />
        </xsl:apply-templates>
      </PatientInfo>
    </PatientRxs>
  </xsl:template>

  <xsl:template match="*" mode="field">
      <xsl:param name="newName" select="local-name()" />

      <xsl:element name="{$newName}">
          <xsl:value-of select="." />
      </xsl:element>
  </xsl:template>

</xsl:stylesheet>

因此,如果匹配的元素不存在,则根本不会为该元素输出任何内容。

答案 1 :(得分:0)

<xsl:template match="Patients">
        <xsl:element name="PatientRxs">
            <xsl:for-each select="Patient">
                <xsl:element name="PatientInfo">
                    <xsl:element name="Forenames">
                        <xsl:value-of select="Forenames"/>
                    </xsl:element>
                    <xsl:if test="VoicePhone">
                        <xsl:element name="Telephone">
                            <xsl:value-of select="VoicePhone"/>
                        </xsl:element>
                    </xsl:if>
                </xsl:element>
            </xsl:for-each>
        </xsl:element>
    </xsl:template>
Test if Voicephone exist then insert element otherwise not.

答案 2 :(得分:0)

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="topmenuitems">
    <input type="checkbox" name="menu-item-topitemtypes" value="itemwithouticon" />
    <input type="checkbox" name="menu-item-topitemtypes" value="itemwithicon" />
    <input type="checkbox" name="menu-item-topitemtypes" value="itemicon" />
</div>

试试这个

相关问题