3

次の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>

ドキュメントに表示されるすべての xsl:text に disable-output-escaping="yes" を設定する方法はありますか?

< xsl:output method="text"/ > を配置するオプションがあり、毎回 & lt; のようなものがあることは知っています。< が表示されますが、line_1、line_2、または line_3 の値に「$lt;」が含まれていることがあります。変更したくないこと(つまり、変更する必要があるのはその間にあるものだけです)

これが私が達成しようとしていることです。私はこのxmlを持っています:

<readlog_l>
 <logline_t>
  <hora>16:01:09</hora>
  <texto>Call-ID: 663903&lt;hola&gt;396@127.0.0.1</texto>
 </logline_t>
</readlog_l>

そして、この翻訳:

<?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>

これを出力にしたい:

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

<screen name="readlog_l">

  <field name="16:01:09 Call-ID: 663903&lt;hola&gt;396@127.0.0.1 " value="" type="label">

</screen>
</display>

フィールド名内の「<」をエスケープしないようにする必要があることに注意してください。これが、出力メソッドテキストを使用できない理由です。

また、これは例であり、翻訳ははるかに大きいことに注意してください。そのため、必要なすべての '<' または '>' に対して disable-output-escaping を記述しない方法を見つけようとしています。

ありがとう!

4

3 に答える 3

2

期待される出力を考えると、これを行う必要はまったくありません。doe を使用せず、テンプレートではなくテンプレートに基づいた解決策を次に示しますfor-each

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

  <xsl:template match="/*">
    <display>
      <screen name="{name(.)}">
        <xsl:apply-templates select="logline_t"/>
      </screen>
    </display>
  </xsl:template>

  <xsl:template match="logline_t">
    <field value="" type="label">
      <xsl:attribute name="name">
        <xsl:apply-templates select="*" mode="fieldvalue"/>
      </xsl:attribute>
    </field>
  </xsl:template>

  <xsl:template match="*[last()]" mode="fieldvalue">
    <xsl:value-of select="." />
  </xsl:template>

  <xsl:template match="*" mode="fieldvalue">
    <xsl:value-of select="." />
    <xsl:text> </xsl:text>
  </xsl:template>

</xsl:stylesheet>
于 2013-01-09T13:33:40.437 に答える
2

質問を明確にしていただきありがとうございます。この場合、出力エスケープを無効にする必要はないと確信しています。XSLT は、あなたがやっていることを達成するために設計されました:

<?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>

この点については少し不明です。フィールド名内の「<」をエスケープしないようにする必要があることに注意してください。これが、出力メソッドテキストを使用できない理由です。

どの < を指していますか? 「ほら」あたりの<と>ですか?これらをエスケープしないままにしておくと、無効な XML になってしまいます。また、サンプル出力の name 属性には、入力 XML にない多くの値があるようです。それらはどこから来たのですか?

于 2013-01-08T17:27:35.580 に答える
1

すべてに doe を設定したい場合は、「手動で」マークアップを生成しようとしていることを示唆しています。それは特に良い考えではないと思います(実際、それはお粗末な考えだと思います)が、それがやりたいことであれば、xml出力方法ではなくテキスト出力方法を使用することをお勧めします。そうすれば、特殊文字のエスケープは行われないため、無効にする必要はありません。

于 2013-01-08T17:21:02.417 に答える