0

伙计们,

有没有办法让标签在其内容模板具有子数据或原始数据(即复杂或简单类型)时呈现?

假设我的 XML 数据如下所示:

数据

<Root>
   <Data>stringdata</Data>
</Root>

我的 XSLT 看起来像这样:

XSLT

<xsl:template match="/Root">
  <xsl:element name="Empty">
    <xsl:choose>
      <xsl:when test="Data = 'stringdata'">
        <xsl:value-of select="Data"/>
      </xsl:when>
    </xsl:choose>
  </xsl:element>
</xsl:template>

当不包含“stringdata”时,将显示一个名为的空元素。如果没有使用选择或 if 语句进行包装,或者设计第二个转换以仅匹配在第一个转换中生成且其中包含数据的元素,我该如何防止生成?

4

2 回答 2

3

除非我遗漏了什么,否则您只需检查模板中的条件即可

<xsl:template match="Root[Data = 'stringdata']">
   <!-- Output Empty Element -->
<xsl:template>

您还需要第二个模板来匹配不匹配且不执行任何操作的Root元素

<xsl:template match="Root" />

请注意,更具体的模板将始终具有优先权。

这是完整的 XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:template match="Root[Data = 'stringdata']">
      <Empty>
         <xsl:value-of select="Data"/>
      </Empty>
   </xsl:template>

   <xsl:template match="Root"/>
</xsl:stylesheet>

当应用于您的 XML 时,它会输出以下内容

<Empty>stringdata</Empty>

将文本更改为其他任何内容,并且不输出任何内容。

于 2012-04-25T19:54:29.143 回答
0

根据您所说的上述评论:

我想要这个数据:<Root> <Data>stringdata</Data> </Root>生产:[nothing] 和这个数据:<Root> <Data>NOTstringdata</Data> </Root>生产:当它没有内容时,<Empty>NOTstringdata</Empty>我希望不被生产。<Empty>

我相信这可以实现您想要的:

<xsl:template match="/Root">
  <xsl:choose>
      <xsl:when test="not(Data='')">
        <!-- Data is not null, now we look to see what sort of Data is there-->
        <xsl:choose>
            <xsl:when test="Data = 'stringdata'">
                <!--nothing-->
            </xsl:when>
            <xsl:otherwise>
                <!--ie. have notstringdata-->
                <xsl:element name="Empty">
                    <xsl:value-of select="Data"/>
                </xsl:element>
            </xsl:otherwise>
        </xsl:choose>

      </xsl:when>
    <xsl:otherwise>
        <!--no Data, so no element created, or you could do something specific for this scenario-->
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

不过,我必须说,考虑到您期望使用它的方式,使用名称“Empty”作为元素名称会使事情变得有点混乱。

于 2012-04-25T19:48:49.850 回答