Wrap an element if it starts with text

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • rick quatro
    New Member
    • Nov 2011
    • 1

    #1

    Wrap an element if it starts with text

    I have a series of <entry> elements whose entire contents I want to wrap in a <p> element.

    For example, here is before:

    <entry>This is a raw entry that needs a p element.</entry>

    Here is after:

    <entry><p>Thi s is a raw entry that needs a p element.</p></entry>

    I want to ignore <entry> elements that already have a top-level child, like this:

    <entry><note> I don't want to add p to these.</note><entry>

    I also want to ignore <entry> elements that just consist of a space, like this:

    <entry> </entry>

    With my stylesheet and XPath statement below, everything works fine. However, it doesn't handle elements like these, that also need to have their contents wrapped:

    <entry>This contains a nested <note>child</note> and I need these wrapped as well.</entry>

    I want to get this:

    <entry><p>Thi s contains a nested <note>child</note> and I need these wrapped as well.</p></entry>

    Any pointers or suggestions would be appreciated. Thank you very much.

    Rick


    Code:
    <?xml version="1.0"?>
    <xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
      <xsl:template match="node() | @*">
        <xsl:copy>
           <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
      </xsl:template>
      <xsl:template match="//node()[parent::entry[not(*)][.!=' ']]">
        <xsl:element name="p">
          <xsl:copy>
             <xsl:apply-templates select="@* | node()"/>
          </xsl:copy>
        </xsl:element>
      </xsl:template>
    </xsl:stylesheet>
Working...