当元素为空时使用不同的元素

  • 本文关键字:元素 xml xslt xslt-1.0
  • 更新时间 :
  • 英文 :


我有一个XML文件,它在两个元素中包含相同的数据。其中一个元素"HTMLDesc"旨在用于网络,其中包括HTML字符,如项目符号。另一个"Fulldesc"用于打印目的。当两个元素都包含数据时,我们希望在所有情况下都使用HTML元素。但是,当HTML元素丢失或为空时,我想使用基于打印的元素。我知道这是一个IF/ELSE函数,但当第一个元素为空或缺失时,如何编写XSLT来选择第二个元素?

以下是XML:的示例

<dataroot>
<CaseStudies>
<H3>New Patient</H3>
<Fulldesc>Office or other outpatient visit.</Fulldesc>
<HTMLdesc><b>Office or other outpatient visit</b></HTMLdesc>
</CaseStudies>
<CaseStudies>
<H3>Old Patient</H3>
<Fulldesc>Office or other outpatient visit.</Fulldesc>
</CaseStudies>
<CaseStudies>
<H3>Young Patient</H3>
<Fulldesc>Office or other outpatient visit.</Fulldesc>
<HTMLdesc><b>Office or other outpatient visit</b></HTMLdesc>
</CaseStudies>
<CaseStudies>
<category>1</category>
<GroupNo>2</GroupNo>
<H3>Female Patient</H3>
<Fulldesc>Office or other outpatient visit.</Fulldesc>
<HTMLdesc />
</CaseStudies>
</dataroot>

以下是基本的XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/>
<xsl:output method="xml"/>
<xsl:template match="/">
<dataroot>
<xsl:apply-templates select="dataroot"/>
</dataroot>
</xsl:template>
<xsl:template match="CaseStudies">
<CaseStudies>
<xsl:apply-templates select="H3"/>
<xsl:apply-templates select="HTMLdesc"/>
</CaseStudies>
</xsl:template>
<H3><xsl:value-of select="."/></H3></xsl:template>
<xsl:template match="HTMLdesc">
<HTMLdesc><xsl:value-of select="."/></HTMLdesc></xsl:template>
</xsl:stylesheet>

您可以在xsl:choose元素内部决定是对HTMLdesc还是对Fulldesc元素执行apply-templates

如果HTMLdesc仅包含空白字符,则此解决方案还会选择Fulldesc元素。

请注意,除了在给定条件下选择某些节点外,您实际上并没有太大的更改。在这种情况下,建议从身份转换开始(而不是像样式表中那样再次键入所有元素(

<xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

并根据需要添加其他模板。

样式表

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>
  <xsl:strip-space elements="*"/>
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
  <xsl:template match="category|GroupNo"/>
  <xsl:template match="CaseStudies">
      <xsl:copy>
      <xsl:apply-templates select="@*|comment()|processing-instruction()|H3"/>
          <xsl:choose>
              <xsl:when test="normalize-space(HTMLdesc) = ''">
                  <xsl:apply-templates select="Fulldesc"/>
              </xsl:when>
              <xsl:otherwise>
                  <xsl:apply-templates select="HTMLdesc"/>
              </xsl:otherwise>
          </xsl:choose>
      </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

输出

<?xml version="1.0" encoding="utf-8"?>
<dataroot>
   <CaseStudies>
      <H3>New Patient</H3>
      <HTMLdesc>
         <b>Office or other outpatient visit</b>
      </HTMLdesc>
   </CaseStudies>
   <CaseStudies>
      <H3>Old Patient</H3>
      <Fulldesc>Office or other outpatient visit.</Fulldesc>
   </CaseStudies>
   <CaseStudies>
      <H3>Young Patient</H3>
      <HTMLdesc>
         <b>Office or other outpatient visit</b>
      </HTMLdesc>
   </CaseStudies>
   <CaseStudies>
      <H3>Female Patient</H3>
      <Fulldesc>Office or other outpatient visit.</Fulldesc>
   </CaseStudies>
</dataroot>

这里有另一个选项,它与其他两个答案相似,但不需要xsl:choose或多个xsl:apply-templates

它基本上是将模板应用于任何一个:

Fulldesc如果HTMLdesc为空或不存在

HTMLdesc如果不是空

先找到的。

XML输入

<dataroot>
    <CaseStudies>
        <H3>New Patient</H3>
        <Fulldesc>Office or other outpatient visit.</Fulldesc>
        <HTMLdesc><b>Office or other outpatient visit</b></HTMLdesc>
    </CaseStudies>
    <CaseStudies>
        <H3>Old Patient</H3>
        <Fulldesc>Office or other outpatient visit.</Fulldesc>
    </CaseStudies>
    <CaseStudies>
        <H3>Young Patient</H3>
        <Fulldesc>Office or other outpatient visit.</Fulldesc>
        <HTMLdesc><b>Office or other outpatient visit</b></HTMLdesc>
    </CaseStudies>
    <CaseStudies>
        <category>1</category>
        <GroupNo>2</GroupNo>
        <H3>Female Patient</H3>
        <Fulldesc>Office or other outpatient visit.</Fulldesc>
        <HTMLdesc />
    </CaseStudies>
</dataroot>

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="CaseStudies">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()[not(self::Fulldesc) and not(self::HTMLdesc)]|
                (Fulldesc[not(string(../HTMLdesc))]|HTMLdesc[string()])[1]"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

XML输出

<dataroot>
   <CaseStudies>
      <H3>New Patient</H3>
      <HTMLdesc>
         <b>Office or other outpatient visit</b>
      </HTMLdesc>
   </CaseStudies>
   <CaseStudies>
      <H3>Old Patient</H3>
      <Fulldesc>Office or other outpatient visit.</Fulldesc>
   </CaseStudies>
   <CaseStudies>
      <H3>Young Patient</H3>
      <HTMLdesc>
         <b>Office or other outpatient visit</b>
      </HTMLdesc>
   </CaseStudies>
   <CaseStudies>
      <category>1</category>
      <GroupNo>2</GroupNo>
      <H3>Female Patient</H3>
      <Fulldesc>Office or other outpatient visit.</Fulldesc>
   </CaseStudies>
</dataroot>

您可以根据HTMLdesc:的内容选择HTMLdescFulldesc模板

<CaseStudies>
    <xsl:apply-templates select="H3"/>
    <xsl:apply-templates select="HTMLdesc[string()]"/>
    <xsl:apply-templates select="Fulldesc[../HTMLdesc[not(string())] or not(../HTMLdesc)]"/>
</CaseStudies>

第二个apply-templates将仅在不为空的情况下选择HTMLdesc模板。

如果HTMLdesc同级为空或不存在,第三个将选择Fulldesc模板(必须将其添加到样式表中(。

相关内容

  • 没有找到相关文章

最新更新