Я использую xsl для преобразования xml в xml. Не могли бы вы помочь мне написать xsl-код для преобразования ввода в вывод?
Данный ввод:
<ATTRIBUTE-VALUE>
<THE-VALUE>
<div xmlns = "http://www.w3.org/1999/xhtml">
<h1 dir = "ltr" id = "_1536217498885">Main Description</h1>
<p>The main description text goes here.</p>
<h1 dir = "ltr" id = "_1536217498886">Key Consideration</h1>
<p>The key consideration text goes here.</p>
<h1 dir = "ltr" id = "_1536217498887">Skills</h1>
<p>The Skills text goes here.</p>
<h1 dir = "ltr" id = "_1536217498888">Synonyms</h1>
<p>The Synonyms text goes here.</p>
</div>
</THE-VALUE>
</ATTRIBUTE-VALUE>
Ожидаемый результат:
<MainDescription><![CDATA[The main description text goes here.]]></MainDescription>
<KeyConsiderations><![CDATA[The key consideration text goes here.]]></KeyConsiderations>
<Skills>The skills text goes here.</Skills>
<Synonyms>The synonyms text goes here.</Synonyms>
Попробуйте следующее (с префиксом x, привязанным к пространству имен xhtml)
<xsl:template match = "THE-VALUE/x:div">
<xsl:for-each-group select = "*" group-starting-with = "x:h1">
<xsl:element name = "{translate(current-group()[1], ' ', '')}">
<xsl:value-of select = "current-group()[2]"/>
</xsl:element>
</xsl:for-each-group>
</xsl:template>
На самом деле это не требует группировки: вы также можете сделать <xsl:for-each select = "h1">
, а затем называть два элемента в группе .
и following-sibling::p[1]
соответственно. Это:
<xsl:template match = "THE-VALUE/x:div">
<xsl:for-each select = "x:h1">
<xsl:element name = "{translate(., ' ', '')}">
<xsl:value-of select = "following-sibling::*[1]"/>
</xsl:element>
</xsl:for-eac>
</xsl:template>
Последнее решение будет работать в XSLT 1.0.
Как поместить значения как форматированный текст в CDATA?
Когда я использую xsl: template, current-group () [2] выдает ошибку недопустимый xpath. Как это решить? Кроме того, что нужно добавить в шаблон для вставки значений в CDATA?
Если current-group () [2] выдает ошибку, вероятно, вы используете процессор XSLT 1.0. Я дал вам ответ 2.0, потому что вы отметили вопрос xslt 2.0.
Теги CDATA в желаемом выводе совершенно бессмысленны и отражают плохое понимание XML. Однако, если вы действительно считаете, что они вам нужны, используйте xsl:output/@cdata-section-elements
.
Я новичок в xslt. Не могли бы вы предоставить решение в xslt-1.0?
Готово. (------------------)
Я новичок в xslt. Может ли кто-нибудь предоставить решение с xslt-1.0?