Преобразуйте xml элемент, содержание которого в CDATA

У меня есть фрагмент XML как ниже

<Detail uid="6">
    <![CDATA[
    <div class="heading">welcome to my page</div>
    <div class="paragraph">this is paraph</div>
    ]]>
</Detail>

и я хочу смочь измениться

<div class="heading">...</div> to <h1>Welcome to my page</h1>
<div class="paragraph">...</div> to <p>this is paragraph</p>

Вы знаете, как я могу сделать это в xslt 1.0

8
задан Mads Hansen 17 January 2010 в 16:34
поделиться

3 ответа

А как насчет запуска двух трансформаций?

Пасс 1.)

<?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet
   version="1.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" encoding="UTF-8"/>

  <xsl:template match="/">
    <xsl:apply-templates />
  </xsl:template>

    <xsl:template match="Detail">
        <Detail>
            <xsl:copy-of select="@*"/>
        <xsl:value-of select="." disable-output-escaping="yes" />
        </Detail>
    </xsl:template>

</xsl:stylesheet>

Будет производить:

<?xml version="1.0" encoding="UTF-8"?>
<Detail uid="6"> 
    <div class="heading">welcome to my page</div>
    <div class="paragraph">this is paraph</div>
</Detail>

Пасс 2.)

<?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet
   version="1.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" encoding="UTF-8"/>

  <xsl:template match="/">
    <xsl:apply-templates />
  </xsl:template>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*| node()" />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="div[@class='heading']">
        <h1><xsl:value-of select="."/></h1>
    </xsl:template>

    <xsl:template match="div[@class='paragraph']">
        <p><xsl:value-of select="."/></p>
    </xsl:template>

</xsl:stylesheet>

Производит:

<?xml version="1.0" encoding="UTF-8"?>
<Detail uid="6">
<h1>welcome to my page</h1>
<p>this is paraph</p>
</Detail>
9
ответ дан 5 December 2019 в 12:58
поделиться

Задача < ant > выполняет необходимые действия:

Запускает Ant для предоставленного файла сборки. Это может использоваться для построения подпроектов.

По умолчанию все свойства текущего проекта будут доступны в новом проекте.

Поэтому необходимо просто вызвать < ant antfile = «dir/build.xml »/> . Нет необходимости устанавливать атрибут inheritAll , по умолчанию он имеет значение true .

-121--4213565-

Оператор | | вычисляет левое выражение, а если оно равно 0 (false), то вычисляет правое выражение. Если левая сторона не равна 0, то она вообще не будет оценивать правую сторону.

В выражении x++ | | x++ | | x++ | |... , первый x++ оценивается; значение равно 0, а значение x увеличивается до 1. Второй x++ оценивается; вычисляется как 1, а x увеличивается до 2. Поскольку второе x++ вычислено как ненулевое значение, ни одно из оставшихся выражений x++ не вычисляется.

-121--2741465-

Невозможно указать XSL 1.0, чтобы извлечь последовательность из CDATA и проанализировать ее как XML.

2
ответ дан 5 December 2019 в 12:58
поделиться

Вы не можете «удалить» CDATA, но вы можете несколько грубо добиться желаемого вывода:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
   <Detail>
        <xsl:variable name="before" select="substring-before(//Detail,'&lt;div class=&quot;heading&quot;&gt;')" />
        <xsl:variable name="afteropen" select="substring-after(//Detail,'&lt;div class=&quot;heading&quot;&gt;')" />
        <xsl:variable name="body" select="substring-before($afteropen, '&lt;/div&gt;')" />
        <xsl:variable name="after" select="substring-after($afteropen, '&lt;/div&gt;')" />
        <xsl:value-of select="concat($before, '&lt;h1&gt;', $body, '&lt;/h1&gt;',$after)"
                disable-output-escaping="yes"       />
   </Detail>
</xsl:template>
</xsl:stylesheet>

Это будет работать для первого типа Div, вы пытаетесь разобрать, и вы может следовать за чем-то похожим со вторым. Это может быть сделано более общем с некоторыми усилиями.

2
ответ дан 5 December 2019 в 12:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: