1

我有一个输入 XML 如下

<testing>
<subject ref="yes">
 <firstname>
    tom
 </firstname>
</subject>
<subject ref="no">
 <firstname>
    sam
</firstname>
</subject>
</testing>

我期待我的输出应该是。

如果主题的 ref 为是。我将获得名称值。否则,如果参考(否)我不会得到元素

<testing>
<firstname>
   tom
</firstname>
</testing>

请在这里指导我。

4

3 回答 3

2

这可以通过建立在恒等变换之上来实现。首先,您需要一个模板来忽略@ref 为“否”的主题元素

<xsl:template match="subject[@ref='no']" />

对于@ref 为“yes”的主题元素,您还有另一个模板可以仅输出其子元素

<xsl:template match="subject[@ref='yes']">
   <xsl:apply-templates select="node()"/>
</xsl:template>

事实上,如果@ref 只能是“是”或“否”,您可以简化此模板匹配,就像<xsl:template match="subject">这将匹配所有没有@ref 为“否”的元素

这是完整的 XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="subject[@ref='no']" />

   <xsl:template match="subject">
      <xsl:apply-templates select="node()"/>
   </xsl:template>

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

应用于您的示例 XML 时,将输出以下内容

<testing>
<firstname> tom </firstname>
</testing>
于 2012-08-08T11:46:12.217 回答
1

这个短暂的转变:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

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

 <xsl:template match="subject[@ref='yes']">
  <xsl:copy-of select="node()"/>
 </xsl:template>
 <xsl:template match="subject"/>
</xsl:stylesheet>

应用于提供的 XML 文档时

<testing>
    <subject ref="yes">
        <firstname>
         tom
     </firstname>
    </subject>
    <subject ref="no">
        <firstname>
         sam
     </firstname>
    </subject>
</testing>

产生想要的正确结果

<testing>
   <firstname>
         tom
     </firstname>
</testing>
于 2012-08-08T12:07:17.533 回答
0

尝试这个:

<testing>
  <xsl:if test="testing/subject/@ref = 'yes'">
    <firstname>
      <xsl:value-of select="testing/subject/firstname" />
    </firstname>
  </xsl:if>
</testing>

我希望这应该适用于 xslt

于 2012-08-08T11:21:40.203 回答