2

我有以下 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>

文本输入很简单,我之前能够为该部分创建一个大的文本区域,但我在过去的几个小时里一直在努力尝试让 before-sibling:: 和 following-sibling:: 工作但没有成功。我确定我只是缺少一些简单的东西。

4

1 回答 1

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>
于 2012-04-06T13:01:15.090 回答