применение шаблона между узлами - PullRequest
0 голосов
/ 02 февраля 2011

Я использую 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 Ответ

1 голос
/ 02 февраля 2011

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

<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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...