Вывод преобразования `>` вместо `>` - PullRequest
4 голосов
/ 07 мая 2011

Спасибо за вашу помощь! Я очень ценю это! Я понимаю, почему мне нужно поместить значения в узлы, но я работаю не с шаблонами, а с функциями ... Я просто не могу понять, как поместить эти узлы и шаблоны в функцию?

Может быть, проще, если я просто покажу свой XSLT-файл. ниже вы можете найти файл, и скажем, например, это может быть строка $, которую она передает функции (из не преобразованного файла XML):

<img src="Afbeeldingen Hotpot/beer.jpg" alt="afbeelding van een beer" title="beer" width="170" height="144" style="display:block; margin-left:auto; margin-right:auto; text-align:center;" style="float:center;" />

Это полное содержимое файла XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"     xmlns:foo="http://www.wathever.com"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs functx"
xmlns:functx="http://www.functx.com">

<xsl:import href="alle-functx-functies.xsl"/>

<xsl:function name="foo:functionIfImage">
    <xsl:param name="string" as="xs:string"/>
        <xsl:if test="contains($string,'.jpg')">
            <xsl:sequence select="foo:functionImage($string,'.jpg')"/>
        </xsl:if>
        <xsl:if test="contains($string,'.png')">
            <xsl:sequence select="foo:functionImage($string,'.png')"/>
        </xsl:if>
        <xsl:if test="contains($string,'.gif')">
            <xsl:sequence select="foo:functionImage($string,'.png')"/>
        </xsl:if>
        <xsl:if test="not(contains($string,'.jpg')) and not(contains($string,'.png')) and not(contains($string,'.gif'))">
            <xsl:sequence select="'iumi ondersteund alleen afbeeldingen van het formaat *.jpg, *.png of *.gif'"/>
        </xsl:if>
        <xsl:if test="not(contains($string,'img src='))">
            <xsl:sequence select="'bevat geen img src='"/>
        </xsl:if>

</xsl:function>
<xsl:function name="foo:functionImage">
    <xsl:param name="string" as="xs:string"/>
    <xsl:param name="type" as="xs:string"/>

    <xsl:variable name="quot">&quot;</xsl:variable>
    <xsl:variable name="beforePath" as="xs:string">img src="</xsl:variable>
    <xsl:variable name="globalPath" as="xs:string" select="substring-before(substring-after($string, $beforePath), $quot)" />
        <xsl:variable name="beforeWidth" as="xs:string">width="</xsl:variable>
        <xsl:variable name="width" as="xs:string" select="substring-before(substring-after($string, $beforeWidth), $quot)" />
            <xsl:variable name="beforeHeight" as="xs:string">height="</xsl:variable>
            <xsl:variable name="height" as="xs:string" select="substring-before(substring-after($string, $beforeHeight), $quot)" />

    <xsl:if test="not(contains($globalPath,'http'))">
        <xsl:variable name="fileName" as="xs:string"><xsl:sequence select="functx:substring-after-last($globalPath,'/')"/></xsl:variable>
        <xsl:variable name="compatibleData" as="xs:string">
            <xsl:sequence select="concat('&lt;img source=&quot;images/',$fileName,'&quot;',' width=&quot;',$width,'&quot; height=&quot;',$height,'&quot; /&gt;')"/>
        </xsl:variable>
        <xsl:value-of disable-output-escaping= "yes" select="$compatibleData" />
    </xsl:if>
    <xsl:if test="contains($globalPath,'http')">
        <xsl:variable name="compatibleData" as="xs:string">
            <xsl:sequence select="concat('&lt;img source=&quot;',$globalPath,'&quot;',' width=&quot;',$width,'&quot; height=&quot;',$height,'&quot; /&gt;')"/>
        </xsl:variable>
        <xsl:value-of disable-output-escaping= "yes" select="$compatibleData" />
    </xsl:if>

</xsl:function>
</xsl:stylesheet>

Итак, этот фрагмент моего XSLT-кода дает мне неверный вывод:

<xsl:variable name="compatibleData" as="xs:string">
            <xsl:sequence select="concat('&lt;img source=&quot;',$globalPath,'&quot;',' width=&quot;',$width,'&quot; height=&quot;',$height,'&quot; /&gt;')"/>
</xsl:variable>
<xsl:value-of disable-output-escaping= "yes" select="$compatibleData" />

Вывод после преобразования:

&lt;img source="images/beer.jpg" width="300" height="300" /&gt;

Вывод, который я хочу после преобразования:

<img source="images/beer.jpg" width="300" height="300" />

Как сделать так, чтобы на выходе было указано < вместо &lt; и > вместо &gt;? value-of disable-output-escaping = "yes" не работает ...

Ответы [ 6 ]

6 голосов
/ 08 мая 2011

Мой XSLT-код:

<xsl:variable name="compatibleData" as="xs:string"><xsl:sequence select="concat('&lt;img source=&quot;images/',$fileName,'&quot;',' width=&quot;',$width,'&quot; height=&quot;',$height,'&quot; /&gt;')"/></xsl:variable>
   <xsl:sequence select="$compatibleData"/> 

Никогда не уничтожайте разметку, избегая ее !!!

Всякий раз, когда XSLT используется для генерации XML-документа, он выводит элемент (и другие типы), узлы - не строки.

Используйте

<img source="images/{$filename}" width="{$width}" height="{$height}" /> 

Объяснение : Использование AVT ( Attribute-Value-Templates ) делает код короче и более читабельным. Всегда используйте AVT, если имена элементов и атрибутов известны заранее.

4 голосов
/ 08 мая 2011

Вы пытаетесь вывести фактический структурированный (неэкранированный) XML, поэтому вам нужно либо

  • предоставить данные в XSLT в виде структурированного XML (как сказал @Jeff Swensen), либо
  • предоставляет данные в XSLT как экранированный XML (как вы делаете), а затем отключите экранирование на выходе (как сказал @rsp).Этот последний считается грязным способом заставить XSLT делать то, что вы хотите, без реального понимания того, что происходит;и он может не работать, в зависимости от вашего процессора XSLT и того, что контролирует сериализацию.
3 голосов
/ 07 мая 2011

На самом деле вы можете просто ввести <br/> в свой XSLT, и он попадет в результат.

<MyElement>
  <xsl:value-of select="/My/Element/Value"/>
  <br/>
</MyElement>
1 голос
/ 07 мая 2011

Почему вы пытаетесь создать переменную с определением тега xs:string?Легко определить переменную с помощью элемента и использовать ее:

<xsl:variable name="compatibleData">
    <img source="images/{$filename}" width="{$width}" height="{$height}"/>
</xsl:variable>

<xsl:template match="something">
    <xsl:copy-of select="$compatibleData"/>
</xsl:template>
0 голосов
/ 11 мая 2011

Вот еще один вариант, для случая, когда вы не можете использовать значение-w / disable-output-escaping (т. Е. В сочетании с copy-of):

<xsl:stylesheet...>
  <xsl:output use-character-maps="special-chars"/>
  <xsl:character-map name="special-chars">
    <xsl:output-character character=">" string="&gt;"/>
  </xsl:character-map>
0 голосов
/ 07 мая 2011

Я думаю, вы можете искать:

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