Как добавить теги <div>и <p>в качестве префикса и суффикса в подробном разделе CDATA, используя XSLT - PullRequest
0 голосов
/ 03 августа 2011

Инструменты: Я использую XSLT и XML.

Подробное описание и проблема:

У меня есть XML, и есть узел с именем "detail", ниже XML:

<?xml version="1.0"?>
<news type="detail">
    <article id="694141" published="7/20/2011 1:19:52 PM" language="English">
        <title><![CDATA[myData &amp; Arik Air sign interline agreement]]></title>
        <detail><![CDATA[<strong>Gives passengers greater access to cities across Nigeria and West Africa&nbsp;
            <br /></strong>&nbsp;DUBAI, U.A.E., 13th July 2011: myData (<a target="_new" href="http://www.myData.com/">www.myData.com</a>), one of the world’s fastest growing airlines, has signed an interline agreement with leading Nigerian carrier Arik Air, making it easy for customers to access a wide range of points across Nigeria and West Africa.
            <br />
            &nbsp;
            <br />
            Under the new agreement, customers will be able to purchase joint myData-Arik Air itineraries, enabling them to connect seamlessly from myData’ double daily services to Lagos onto cities including Abuja, Kano, Kaduna, Port Harcort and Enugu .
            <br />
            ]]>
        </detail>
    </article>
</news>

В приведенном выше узле XML «детали» вы можете видеть, что используются CDATA, теперь содержимое над разделом «детали» копируется и вставляется редакторами, иногда они помещают теги <div> и <p> в начале. из раздела «детализация», и иногда они пропускали теги <div> и <p> во время процесса копирования и вставки, и это создает проблемы с форматированием на моей странице, поэтому теперь я хочу проверить, есть ли <div> и <p> в начале раздела он должен вести себя как обычно, иначе мы добавим <div> <p> в качестве префикса и </p> </div> в качестве суффикса. Чтобы получить это, я использую приведенную ниже логику в XSLT, но не получаю успеха.

У меня есть XSLT, и ниже приведено несколько кодов, взятых из него.

<xsl:variable name="art_detail" select="/news/article/detail" /> //here I am taking all the node object in variable

<!-- Check if the immediate preceding sibling was a p or div tag? Yes - Use the same XML, No - Add a <div> tag to the xml result --> 
<xsl:variable name="addNode2Detail">
<xsl:choose>
    <xsl:when test="(starts-with($art_detail,'&lt;div&gt;')) or (starts-with($art_detail,'&lt;p&gt;'))">
    <xsl:value-of select="$art_detail"/>
  </xsl:when>
  <xsl:otherwise>
    <xsl:value-of select="concat('&lt;div&gt;',$art_detail,'&lt;/div&gt;')"/>
  </xsl:otherwise>
</xsl:choose>
</xsl:variable>

<xsl:variable name="detail" select="utils:DecodeCDATA($addNode2Detail)" />

Вышеприведенная логика работает нормально, однако я не хочу использовать вместо этого начальное, я хотел бы использовать что-то вроде

<xsl:when test="($art_detail//preceding-sibling::div or $art_detail//preceding-sibling::p) and node() and string-length(normalize-space(//text())>1)">

Ниже приведен пример кода, который я пытаюсь написать, но безуспешно "msxsl: node-set" снова вызывает проблему и удаляет все разделы форматирования, я имею в виду, что страница выглядит вымотанной.

<xsl:template match="article">
    <xsl:choose>
      <xsl:when test="($art_detail//preceding-sibling::div or $art_detail//preceding-sibling::p) and node() and string-length(normalize-space(//text())>1)">
        $<xsl:apply-templates select="$art_detail" mode="content"/>$
      </xsl:when>
      <xsl:otherwise>            
         *<xsl:apply-templates select="msxsl:node-set(concat('&lt;div&gt;',$art_detail,'&lt;/div&gt;'))" mode="content"/>*
      </xsl:otherwise>
    </xsl:choose>
</xsl:template>

Пожалуйста, предложите любую другую логику для достижения вышеуказанного решения !!

Спасибо.

1 Ответ

0 голосов
/ 03 августа 2011

Вы не можете использовать такие вещи, как previous-sibling :: div, потому что в вашем документе нет элемента div. Весь смысл CDATA состоит в том, чтобы сказать: «здесь есть символьные данные; они могут выглядеть как разметка, но я не хочу, чтобы это воспринималось как разметка». Поэтому тот, кто решил обернуть содержимое в CDATA, сознательно пытался помешать вам сделать это.

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