xsl хочет преобразовать следующее xml в html: - PullRequest
0 голосов
/ 17 января 2020
<!ELEMENT TITLE      (CDATA | ELEMENTX )+  > 

Если я использую нижеследующее, то когда TITLE содержит CDATA, а ELEMENTX содержит CDATA, я получаю дублированный текст. Как должен быть написан шаблон для этого элемента TITLE?

<xsl:template match="TITLE">
  <span>
    <p><xsl:value-of select="."/></p>
    <xsl:for-each select="*">
      <xsl:choose>
        <xsl:when test="local-name()='ELEMENT1'"> 
          <xsl:apply-templates select="."/>
        </xsl:when>
        <xsl:otherwise>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:for-each> 
   </span>
</xsl:template>

Ответы [ 2 ]

0 голосов
/ 24 января 2020

Кажется, что следующее делает именно то, что мне нужно. Он выводит текст из родительского элемента TITLE, если он есть, перед любым дочерним элементом. Затем он работает с дочерним элементом, если таковой имеется, и затем выводит любой текст в родительском элементе до следующего дочернего элемента и т. Д.

<xsl:template match="TITLE">
  <span>
  <xsl:for-each select="* | ./text()">
    <xsl:choose>
    <xsl:when test="local-name()=''">
      <xsl:value-of select="."/>
    </xsl:when>
    <xsl:when test="local-name()='ELEMENT1'"> 
      <xsl:apply-templates select="."/>
    </xsl:when>
    <xsl:otherwise>
    </xsl:otherwise>
    </xsl:choose>
  </xsl:for-each> 
  </span>
</xsl:template>  
0 голосов
/ 20 января 2020

Насколько я понимаю, кажется, что вы застряли, когда в DTD разрешен смешанный тип контента, и вы обрабатываете, когда появляются CDATA и сталкиваются с проблемой, если есть дополнительные дочерние элементы.

Если вы полагаете, чтобы pu sh весь дочерний элемент внутри p, тогда вы можете использовать <xsl:apply-templates/> и обрабатывать дополнительные данные в шаблоне.

Если вам требуется только обработать код для обновления CDATA, используйте

    <p>
        <xsl:if test="text()">
            <xsl:value-of select="text()"/>
        </xsl:if>
    </p>

вместо

<p><xsl:value-of select="."/></p>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...