home contribute faq download

FunctX XSLT Functions

functx:remove-elements-not-contents

Removes descendant XML elements but keeps their content

Google
Webxsltfunctions.com

Description

The functx:remove-elements-not-contents function removes descendant elements from all of the nodes in $nodes based on name, but keeps the contents of the removed elements. This is useful, for example, for removing in-line formatting. The $names argument is a sequence of strings that represent element names to remove. Prefixes can (and must) be used in the $names values for elements that are prefixed in the input documents. You can also specify wildcard values "*", "*:" and ":*" in the second argument. See the description for functx:name-test for details.

Arguments and Return Type

NameTypeDescription
$nodes node()* the root(s) to start from
$names xs:string* the names of the elements to remove
return value node()*

XSLT Function Declaration

See XQuery definition.
<xsl:function name="functx:remove-elements-not-contents" as="node()*"
              xmlns:functx="http://www.functx.com">
  <xsl:param name="nodes" as="node()*"/>
  <xsl:param name="names" as="xs:string*"/>

   <xsl:for-each select="$nodes">
     <xsl:choose>
       <xsl:when test=". instance of element()">
         <xsl:choose>
           <xsl:when test="functx:name-test(name(),$names)">
             <xsl:sequence select="
                 functx:remove-elements-not-contents(node(), $names)"/>
           </xsl:when>
           <xsl:otherwise>
             <xsl:element name="{node-name(.)}">
               <xsl:sequence select="@*,
                 functx:remove-elements-not-contents(node(),$names)"/>
             </xsl:element>
           </xsl:otherwise>
         </xsl:choose>
       </xsl:when>
       <xsl:when test=". instance of document-node()">
         <xsl:document>
             <xsl:sequence select="
                 functx:remove-elements-not-contents(node(), $names)"/>
         </xsl:document>
       </xsl:when>
       <xsl:otherwise>
         <xsl:sequence select="."/>
       </xsl:otherwise>
     </xsl:choose>
   </xsl:for-each>

</xsl:function>

Examples

<xsl:variable name="in-xml-1" as="item()*">
<in-xml>
   <a>
      <b>b1</b>
      <c>c1</c>
   </a>
   <c>Mixed <b>content</b></c>
</in-xml>
</xsl:variable>
<xsl:variable name="in-xml-2" as="item()*">
<in-xml xmlns:x="http://x">
   <a>
      <b>b1</b>
      <c>c1</c>
   </a>
   <c>Mixed <x:b>content</x:b></c>
</in-xml>
</xsl:variable>
XPath ExampleResults
functx:remove-elements-not-contents(
     $in-xml-1, 'b')
<in-xml>
  <a>b1<c>c1</c>
  </a>
  <c>Mixed content</c>
</in-xml>
functx:remove-elements-not-contents(
     $in-xml-1, ('b','c'))
<in-xml>
  <a>b1c1</a>Mixed content
</in-xml>
functx:remove-elements-not-contents(
     $in-xml-1, 'a')
<in-xml>
  <b>b1</b>
  <c>c1</c>
  <c>Mixed <b>content</b>
  </c>
</in-xml>
functx:remove-elements-not-contents(
     $in-xml-2, 'x:b')
<in-xml>
  <a>
    <b>b1</b>
    <c>c1</c>
  </a>
  <c>Mixed content</c>
</in-xml>

Depends On

functx:name-testWhether a name matches a list of names or name wildcards

See Also

functx:remove-elementsRemoves child elements from an XML node, based on name
functx:remove-elements-deepRemoves descendant elements from an XML node, based on name

History

Published OnLast UpdatedContributor(s)
2006-06-272007-02-26Priscilla Walmsley, Datypic, pwalmsley@datypic.com, http://www.datypic.com
Datypic XSLT Services

Recommended Reading:

XQuery