Инструменты:
Я использую 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 & Arik Air sign interline agreement]]></title>
<detail><![CDATA[<strong>Gives passengers greater access to cities across Nigeria and West Africa
<br /></strong> 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 />
<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,'<div>')) or (starts-with($art_detail,'<p>'))">
<xsl:value-of select="$art_detail"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="concat('<div>',$art_detail,'</div>')"/>
</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('<div>',$art_detail,'</div>'))" mode="content"/>*
</xsl:otherwise>
</xsl:choose>
</xsl:template>
Пожалуйста, предложите любую другую логику для достижения вышеуказанного решения !!
Спасибо.