2012-04-06 32 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 ::和下面的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

聪明!谢谢。 – 2012-04-06 13:24:01

+0

@JasonFrancis:不客气。 – 2012-04-06 13:28:41