在节点之间应用模板

时间:2011-02-02 08:10:14

标签: xslt

我正在使用xslt1.0。我必须在节点之间应用模板w:instrText和w:fldChar w:fldCharType =“end”/>并且......请帮助我..

<w:r w:rsidRPr="00ED1487">
    <w:rPr>
        <w:i/>
        <w:color w:val="E36C0A" w:themeColor="accent6" w:themeShade="BF"/>
    </w:rPr>
    <w:instrText xml:space="preserve"
    > DATE  \@ "dddd, MMMM dd, yyyy"  \* MERGEFORMAT </w:instrText>
</w:r>
<w:r w:rsidRPr="00ED1487">
    <w:rPr>
        <w:i/>
        <w:color w:val="E36C0A" w:themeColor="accent6" w:themeShade="BF"/>
    </w:rPr>
    <w:fldChar w:fldCharType="separate"/>
</w:r>
<w:r w:rsidRPr="00ED1487">
    <w:rPr>
        <w:i/>
        <w:noProof/>
        <w:color w:val="E36C0A" w:themeColor="accent6" w:themeShade="BF"/>
    </w:rPr>
    <w:t>Wednesday</w:t>
</w:r>
<w:r>
    <w:rPr>
        <w:noProof/>
    </w:rPr>
    <w:t>, February 02, 2011</w:t>
</w:r>
<w:r>
    <w:fldChar w:fldCharType="end"/>
</w:r>

1 个答案:

答案 0 :(得分:1)

此转化

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:w="w:w">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:key name="kinBetween" match="w:r"
  use="concat(generate-id(preceding-sibling::w:r[w:instrText][1]),
              '+',
              generate-id(following-sibling::w:r
                                [w:fldChar/@w:fldCharType='end'])
             )
      "/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="/*">
  <t>
   <xsl:apply-templates select=
   "key('kinBetween',
         concat(generate-id(w:r[w:instrText][1]),
                '+',
                generate-id(w:r[w:fldChar/@w:fldCharType='end'][1])
                )
         )
   "/>
  </t>
 </xsl:template>
</xsl:stylesheet>

应用于提供的输入(更正为格式良好的XML文档):

<t xmlns:w="w:w">
    <w:r w:rsidRPr="00ED1487" >
        <w:rPr>
            <w:i/>
            <w:color w:val="E36C0A" w:themeColor="accent6" w:themeShade="BF"/>
        </w:rPr>
        <w:instrText xml:space="preserve"> DATE  \@ "dddd, MMMM dd, yyyy"  \* MERGEFORMAT </w:instrText>
    </w:r>
    <w:r w:rsidRPr="00ED1487">
        <w:rPr>
            <w:i/>
            <w:color w:val="E36C0A" w:themeColor="accent6" w:themeShade="BF"/>
        </w:rPr>
        <w:fldChar w:fldCharType="separate"/>
    </w:r>
    <w:r w:rsidRPr="00ED1487">
        <w:rPr>
            <w:i/>
            <w:noProof/>
            <w:color w:val="E36C0A" w:themeColor="accent6" w:themeShade="BF"/>
        </w:rPr>
        <w:t>Wednesday</w:t>
    </w:r>
    <w:r>
        <w:rPr>
            <w:noProof/>
        </w:rPr>
        <w:t>, February 02, 2011</w:t>
    </w:r>
    <w:r>
        <w:fldChar w:fldCharType="end"/>
    </w:r>
</t>

进程(标识模板不需要特定处理)确切地说明所需间隔内的节点并生成所需的正确结果

<t xmlns:w="w:w">
   <w:r w:rsidRPr="00ED1487">
      <w:rPr>
         <w:i/>
         <w:color w:val="E36C0A" w:themeColor="accent6" w:themeShade="BF"/>
      </w:rPr>
      <w:fldChar w:fldCharType="separate"/>
   </w:r>
   <w:r w:rsidRPr="00ED1487">
      <w:rPr>
         <w:i/>
         <w:noProof/>
         <w:color w:val="E36C0A" w:themeColor="accent6" w:themeShade="BF"/>
      </w:rPr>
      <w:t>Wednesday</w:t>
   </w:r>
   <w:r>
      <w:rPr>
         <w:noProof/>
      </w:rPr>
      <w:t>, February 02, 2011</w:t>
   </w:r>
</t>

解释:定义名为kinBetween的密钥,用于标识两个w:r元素之间的所有w:r元素,以及start-interval所需的属性 - element和end-interval-element。