Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Setting disable-output-escaping="yes" for every xsl:text tag in the xml

say I have the following xml:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/*">
  <display>
    <xsl:for-each select="logline_t">
      <xsl:text disable-output-escaping="yes">&lt;</xsl:text> <xsl:value-of select="./line_1" <xsl:text disable-output-escaping="yes">&gt;</xsl:text>
      <xsl:text disable-output-escaping="yes">&lt;</xsl:text> <xsl:value-of select="./line_2" <xsl:text disable-output-escaping="yes">&gt;</xsl:text>
      <xsl:text disable-output-escaping="yes">&lt;</xsl:text> <xsl:value-of select="./line_3" <xsl:text disable-output-escaping="yes">&gt;</xsl:text>
    </xsl:for-each>
  </display>
</xsl:template>
</xsl:stylesheet>

Is there a way to set disable-output-escaping="yes" to all of the xsl:text that appear in the document?

I know there is an option to put < xsl:output method="text"/ > and every time something like & lt; appears, a < will appear, but the thing is that sometimes in the values of line_1, line_2 or line_3, there is a "$lt;" that I don't want changed (this is, I only need whatever is between to be changed)

This is what I'm trying to accomplish. I have this xml:

<readlog_l>
 <logline_t>
  <hora>16:01:09</hora>
  <texto>Call-ID: 663903&lt;hola&gt;[email protected]</texto>
 </logline_t>
</readlog_l>

And this translation:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/*">
 <display>

  &lt;screen name="<xsl:value-of select="name(.)"/>"&gt;

  <xsl:for-each select="logline_t">
  &lt; field name="<xsl:for-each select="*"><xsl:value-of select="."/></xsl:for-each>" value="" type="label"/&gt;
  </xsl:for-each>

  &lt;/screen&gt;

 </display>
</xsl:template>

</xsl:stylesheet>

I want this to be the output:

<?xml version="1.0"?>
<display>

<screen name="readlog_l">

  <field name="16:01:09 Call-ID: 663903&lt;hola&gt;[email protected] " value="" type="label">

</screen>
</display>

Note that I need the "<" inside the field name not to be escaped, this is why I can't use output method text.

Also, note that this is an example and the translations are much bigger, so this is why I'm trying to find out how not to write disable-output-escaping for every '<' or '>' I need.

Thanks!

like image 827
nojero Avatar asked Dec 07 '25 21:12

nojero


1 Answers

Thanks for clarifying the question. In this case, I'm fairly sure there's no need to disable output escaping. XSLT was designed to accomplish what you're doing:

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/*">
 <display>

  <screen name="{name(.)}">

  <xsl:for-each select="logline_t">
     <xsl:variable name="nameContent">
        <xsl:for-each select="*">
          <xsl:if test="position() > 1"><xsl:text> </xsl:text></xsl:if>                 
          <xsl:value-of select="."/>
        </xsl:for-each>
     </xsl:variable>
     <field name="{$nameContent}" value="" type="label" />
  </xsl:for-each>

  </screen>

 </display>
</xsl:template>

</xsl:stylesheet>

I'm a bit unclear on this point: Note that I need the "<" inside the field name not to be escaped, this is why I can't use output method text.

Which < are you referring to? Is it the < and > around "hola"? If you left those unescaped you would wind up with invalid XML. It also looks like the name attribute in your sample output have a lot of values that aren't in the input XML. Where did those come from?

like image 55
JLRishe Avatar answered Dec 12 '25 11:12

JLRishe



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!