2012-04-06 7 views
2

У меня есть следующий XML:XSLT: нарубить смешанного содержимого узла

<section editable="true"> 
    <p>If you have any questions about the project at Test School or how we plan to use the results, please contact <contact>Al c</contact><contact_info> at <contact_email>email address</contact_email> or <contact_phone>phone number</contact_phone>.</contact_info></p> 
    <p>Your feedback is valuable, and <strong>I</strong> want to thank you personally for considering this request.</p> 
    <p>Sincerely,</p> 
</section> 

и у меня есть новое требование, чтобы создать такую ​​форму:

<textarea>If you have any questions about the project at Test School or how we plan to use the results, please contact</textarea> 
<input type="text" value="Al c " /> 
<input type="text" value="at email address or phone number." /> 
<textarea>Your feedback is valuable, and I want to thank you personally for considering this request. 
Sincerely,</textarea> 

Текстовые входы просты, и я смог создать один большой текстовый ящик для раздела, но я работал последние несколько часов, пытаясь добиться того, чтобы предыдущий-сиблинг :: и следующий-sibling :: работал без успеха. Я уверен, что я просто пропустил что-то простое.

ответ

2

Это преобразование:

<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:key name="kFollowing" match="p[not(contact | contact_info)]" 
    use="generate-id(preceding-sibling::* 
          [not(self::p) 
          or 
           not(contact | contact_info) 
           ] 
           [1] 
         )"/> 

<xsl:template match="/*"> 
    <xsl:apply-templates select="*[1]"/> 
</xsl:template> 
<xsl:template match="p/text()"> 
    <textarea><xsl:value-of select="."/></textarea> 
</xsl:template> 

<xsl:template match="p[contact | contact_info]"> 
    <xsl:apply-templates/> 
    <xsl:apply-templates select="following-sibling::*[1]"/> 
</xsl:template> 

<xsl:template match="contact | contact_info"> 
    <input type="text" value="{normalize-space()}"/> 
</xsl:template> 

<xsl:template match="p[not(contact | contact_info)][1]"> 
    <textarea> 
    <xsl:copy-of select= 
    "(.|key('kFollowing', generate-id()))//text()"/> 
    </textarea> 
</xsl:template> 
</xsl:stylesheet> 

при нанесении на поставленном XML документа:

<section editable="true"> 
    <p>If you have any questions about the project at Test School or how we plan to use the results, please contact 
     <contact>Al c</contact> 
     <contact_info> at 
      <contact_email>email address</contact_email> or 
      <contact_phone>phone number</contact_phone>. 
     </contact_info> 
    </p> 
    <p>Your feedback is valuable, and 
     <strong>I</strong> want to thank you personally for considering this request. 
    </p> 
    <p>Sincerely,</p> 
</section> 

производит разыскиваемого, правильный результат:

<textarea>If you have any questions about the project at Test School or how we plan to use the results, please contact 
     </textarea> 
<input type="text" value="Al c"/> 
<input type="text" value="at email address or phone number."/> 
<textarea>Your feedback is valuable, and 
     I want to thank you personally for considering this request. 
    Sincerely,</textarea> 
+0

Умный! Спасибо. –

+0

@JasonFrancis: Добро пожаловать. –

Смежные вопросы