Разделенные itali c и теги span внутри элемента списка в xslt - PullRequest
0 голосов
/ 04 августа 2020

Я новичок в мире XSLT, заранее благодарю вас за ваше понимание. Мне нужно подготовить xml, который будет отправлен на сервер Adobe InDesign. В файлах html, которые являются моими входными данными, которые мне нужно преобразовать в xml и отправить в Adobe InDesign с помощью преобразования XSLT, у меня есть элементы «li» с тегами «span» и «i» (itali c) внутри. Я хочу, чтобы теги «i» были выделены курсивом в последней строке xml для InDesign. Я попытался сопоставить теги «i» по следующему xslt:

<xsl:template match="i" mode="process-text">
      <CharacterStyleRange AppliedCharacterStyle="CharacterStyle/Italic">
        <Content>      
           <xsl:copy-of select="text()"/>
        </Content>
    </CharacterStyleRange>
</xsl:template>

, но без результатов.

Например, у меня есть следующий ввод:

<li class="MsoNormal" style="mso-list:l0 level2 lfo1;tab-stops:list 1.0in">Systolic dysfunction: an&#xa0;<i>inotropic</i>&#xa0;abnormality, due to myocardial infarction (MI) or dilated or ischemic cardiomyopathy (CM), resulting in diminished systolic emptying (ejection fraction &lt;45%).</li>

Я хотел бы преобразовать его в следующий:

<ParagraphStyleRange AppliedParagraphStyle="ParagraphStyle/BL2">
         <CharacterStyleRange AppliedCharacterStyle="CharacterStyle/$ID/[No character style]">
            <Content>Systolic dysfunction: an </Content>
            <CharacterStyleRange AppliedCharacterStyle="CharacterStyle/Italic">
                <Content>inotropic</Content>
            </CharacterStyleRange>
        <Content> abnormality, due to myocardial infarction (MI) or dilated or ischemic cardiomyopathy (CM), resulting in diminished systolic emptying (ejection fraction &lt;45%).</Content>
            <Br/>
         </CharacterStyleRange>
   </ParagraphStyleRange>

Моя первоначальная проблема заключается в том, как разделить тег "li" и обработать (отдельно) текст внутри, а также отдельно обработать "span" и " я "теги внутри" li "XSLT? Заранее благодарим вас за любую помощь.

ОБНОВЛЕНИЕ: Мой основной шаблон для элементов «li»:

<xsl:template match="li[not(descendant::p) and not(ancestor::section[@class='references' or @class='References'])]" mode="li-pass1">    
       <xsl:variable name="depth" select="count(ancestor::li) + 1"/>
    
    <xsl:variable name="listType">
      <xsl:choose>
        <xsl:when test="parent::ol">
          <xsl:value-of select="'NL'"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="'BL'"/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:variable>
    
      <ParagraphStyleRange AppliedParagraphStyle="ParagraphStyle/{$listType}{if ($depth eq 1) then '' else $depth}">          
      <xsl:choose>
        <xsl:when test="descendant::i/text()">
          <Content>      
             <xsl:copy-of select="./text() | descendant::span/text() "/>
          </Content>
      <CharacterStyleRange AppliedCharacterStyle="CharacterStyle/Italic">
              <Content>      
                  <xsl:copy-of select="descendant::i/text()"/>
              </Content>
          </CharacterStyleRange>
        </xsl:when>
        <xsl:otherwise>
          <Content>      
             <xsl:copy-of select="./text() | descendant::span/text() "/>
          </Content>
        </xsl:otherwise>
      </xsl:choose>
      </ParagraphStyleRange>
    </xsl:template>

Этот шаблон влияет на окончательный xml в неправильный путь. Я получил следующий результат:

<ParagraphStyleRange AppliedParagraphStyle="ParagraphStyle/BL">
         <CharacterStyleRange AppliedCharacterStyle="CharacterStyle/$ID/[No character style]">
            <Content>Two potential pathophysiologic conditions lead to the clinical findings of HF, namely systolic and/or diastolic heart dysfunction. 
          </Content>
         </CharacterStyleRange>
         <CharacterStyleRange AppliedCharacterStyle="CharacterStyle/Italic">
            <Content>inotropiccompliance</Content>
         </CharacterStyleRange>
         <CharacterStyleRange AppliedCharacterStyle="CharacterStyle/$ID/[No character style]"/>
      </ParagraphStyleRange>
      <ParagraphStyleRange AppliedParagraphStyle="ParagraphStyle/BL2">
         <CharacterStyleRange AppliedCharacterStyle="CharacterStyle/$ID/[No character style]">
            <Content>Systolic dysfunction: an  abnormality, due to myocardial infarction (MI) or dilated or ischemic cardiomyopathy (CM), resulting in diminished systolic emptying (ejection fraction &lt;45%).</Content>
         </CharacterStyleRange>
         <CharacterStyleRange AppliedCharacterStyle="CharacterStyle/Italic">
            <Content>inotropic</Content>
         </CharacterStyleRange>
         <CharacterStyleRange AppliedCharacterStyle="CharacterStyle/$ID/[No character style]"/>
      </ParagraphStyleRange>

Итак, как видите, элементы itali c находятся в отдельном теге, но без другого содержимого. Не могли бы вы посоветовать, что мне нужно сделать?

1 Ответ

0 голосов
/ 05 августа 2020

Я бы попытался написать шаблоны, сопоставляющие каждый тип элемента с соответствующей структурой результата и внутренне использовать <xsl:apply-templates/> для продолжения обработки. Таким образом, базовый подход c для этого образца будет выглядеть как

<xsl:template match="li">
    <xsl:variable name="depth" select="count(ancestor::li) + 1"/>
    
    <xsl:variable name="listType">
      <xsl:choose>
        <xsl:when test="parent::ol">
          <xsl:value-of select="'NL'"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="'BL'"/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:variable>
    
     <ParagraphStyleRange AppliedParagraphStyle="ParagraphStyle/{$listType}{if ($depth eq 1) then '' else $depth}">
         <CharacterStyleRange AppliedCharacterStyle="CharacterStyle/$ID/[No character style]">
           <xsl:apply-templates/>
         </CharacterStyleRange>   
     </ParagraphStyleRange>
</xsl:template>

<xsl:template match="i">
      <CharacterStyleRange AppliedCharacterStyle="CharacterStyle/Italic">
        <Content>      
           <xsl:apply-templates/>
        </Content>
    </CharacterStyleRange>
</xsl:template>

<xsl:template match="text()[normalize-space()]">
    <Content>
        <xsl:value-of select="."/>
    </Content>
</xsl:template>

https://xsltfiddle.liberty-development.net/93dFK9Q

Это дает

<ParagraphStyleRange AppliedParagraphStyle="ParagraphStyle/BL">
   <CharacterStyleRange AppliedCharacterStyle="CharacterStyle/$ID/[No character style]">
      <Content>Systolic dysfunction: an </Content>
      <CharacterStyleRange AppliedCharacterStyle="CharacterStyle/Italic">
         <Content>
            <Content>inotropic</Content>
         </Content>
      </CharacterStyleRange>
      <Content> abnormality, due to myocardial infarction (MI) or dilated or ischemic cardiomyopathy (CM), resulting in diminished systolic emptying (ejection fraction &lt;45%).</Content>
   </CharacterStyleRange>
</ParagraphStyleRange>

Я мог бы не собрали все детали необходимого вам формата вывода, но я надеюсь, что образец показывает, что ключ заключается в использовании apply-templates для обработки дочерних узлов с соответствующими шаблонами.

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