如果使用Xslt它不为null,则获取节点和值

时间:2014-11-24 14:49:40

标签: xslt xslt-1.0

我的要求如下:

如果我输入为:

<?xml version="1.0"?>
<new:NewAddressData xmlns:new="http://www.example.org/NewAddress">
  <new:NewStreet></new:NewStreet>
  <new:NewArea>Area_1</new:NewArea>
  <new:NewState></new:NewState>
</new:NewAddressData>

输出应为:

<new:NewArea>Area_1</new:NewArea>

实际上Iam新的蜜蜂到XSLT,但我读了一些基础知识并尝试了下面的代码:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*"/>
<!-- identity transform -->
<xsl:template match="@*|node()">        
    <xsl:copy>
        <xsl:choose>
            <xsl:when test="@*|node() != ''">  
      <xsl:value-of select="." disable-output-escaping="yes" />
            </xsl:when>                        
            <xsl:otherwise>
                <xsl:apply-templates  select="@*|node()"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:copy>
</xsl:template>

为此我输出为:

<new:NewAddressData xmlns:new="http://www.example.org/NewAddress">Area_1</new:NewAddressData>

预期值应该是:

<new:NewArea>Area_1</new:NewArea>

那么如何使用XSLT 1.0实现这一目标

提前致谢

2 个答案:

答案 0 :(得分:1)

你可以这样做:

<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="*[text()]">
        <xsl:copy-of select="."/>
    </xsl:template>

</xsl:stylesheet>

根据输入,如果有多个元素包含文本,这可能会导致输出格式不正确。

答案 1 :(得分:0)

看起来您已经阅读了有关XSLT身份模板的信息,这很好!

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

就其本身而言,这将在所有未更改的节点上复制(例如您的NewArea元素),因此您需要为要更改的内容编写模板。在这种情况下,您似乎想要删除没有非空文本节点的元素作为子节点。

 <xsl:template match="*[not(text()[normalize-space()])]">

试试这个XSLT

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

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

   <xsl:template match="*[not(text()[normalize-space()])]">
      <xsl:apply-templates />
   </xsl:template>
</xsl:stylesheet>

这会输出以下内容

 <new:NewArea xmlns:new="http://www.example.org/NewAddress">Area_1</new:NewArea>

此处需要命名空间。您不能输出带前缀的元素,也不能声明与之关联的命名空间。