0

<一部のノードを置き換える必要があるため、soap xml リクエストを出力する必要があり、 xslt を使用してこれを行う方法を使用する&lt;と 、出力は次のようになります。>&gt;

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"     xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<env:Body><Create xmlns="http://jerseytelecom.com/">
<requestXml>
&lt;ISD_XMLGateway&gt;
&lt;Entity&gt;HLR_ALC&lt;/Entity&gt;
&lt;Origin&gt;Comverse One&lt;/Origin&gt;
&lt;Log_Level&gt;0&lt;/Log_Level&gt;
&lt;Params&gt;&lt;Param Name=&quot;HLR_System&quot; Value=&quot;JT&quot;/&gt;
&lt;Param Name=&quot;HLR_ALC_Command&quot; Value=&quot;Send_HLR_Command&quot;/&gt;
&lt;Param Name=&quot;HLR_Command&quot; Value=&quot;CRESBX:MSIN=112210231,MODEL=MODEL001,SNBSV=7797242727-TEL;&quot;/&gt;
&lt;/Params&gt;
&lt;/ISD_XMLGateway&gt;
</requestXml></Create></env:Body></env:Envelope>
4

2 に答える 2

1

XSLT は、XML マークアップで「<」と「>」の文字を認識することはありません。これは、レキシカル XML では機能せず、XML のツリー表現で機能するためです。だからあなたは質問を間違って定式化しました。実際にやりたいことは、ツリーをレキシカル XML にシリアル化し、そのレキシカル XML を文字列として結果ツリーに挿入することです (その後、シリアライザーはそのレキシカル XML の「<」と「>」文字を「&」に変換します)。 lt;" および "& gt;")。

XSLT 2.0 にはこれを行う組み込みの serialize() 関数はありませんが、最近の Saxon リリース (商用版のみ) では XSLT 3.0 の serialize() 関数がサポートされています。

于 2013-01-02T18:21:37.547 に答える
0

これは、XSLT 1.0 で XML をエスケープするために機能するはずです。

  <xsl:template match="*" mode="escape">
    <xsl:variable name="currentNode" select="." />
    <xsl:value-of select="concat('&lt;', name(.))"/>
    <xsl:apply-templates select="@*" mode="escape"/>
    <xsl:for-each select="namespace::*[name() != 'xml'][not(. = $currentNode/../namespace::*)]">
      <xsl:call-template name="EscapeNamespace">
        <xsl:with-param name="namespace" select="." />
      </xsl:call-template>
    </xsl:for-each>
    <xsl:value-of select="'&gt;'"/>
    <xsl:apply-templates select="node()" mode="escape" />
    <xsl:value-of select="concat('&lt;/', local-name(.), '&gt;')"/>
  </xsl:template>

  <xsl:template match="@*" mode="escape">
    <xsl:value-of select="concat(' ', name(.), '=&quot;')"/>
    <xsl:call-template name="EscapeText">
      <xsl:with-param name="text" select="." />
    </xsl:call-template>
    <xsl:value-of select="'&quot;'"/>
  </xsl:template>

  <xsl:template match="text()" mode="escape">
    <xsl:call-template name="EscapeText">
      <xsl:with-param name="text" select="." />
    </xsl:call-template>
  </xsl:template>

  <xsl:template name="EscapeNamespace">
    <xsl:param name="namespace" />

    <xsl:variable name="prefix">
      <xsl:choose>
        <xsl:when test="name($namespace) = ''">
          <xsl:value-of select="'xmlns'"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="concat('xmlns:',name($namespace))" />
        </xsl:otherwise>
      </xsl:choose>
    </xsl:variable>

    <xsl:value-of select="concat(' ', $prefix, '=&quot;')"/>
    <xsl:call-template name="EscapeText">
      <xsl:with-param name="text" select="$namespace" />
    </xsl:call-template>
    <xsl:value-of select="'&quot;'"/>
  </xsl:template>

  <xsl:variable name="EntitiesRaw">
    <entity value="&quot;" escaped="&amp;quot;" />
    <entity value="&amp;" escaped="&amp;amp;" />
    <entity value="&lt;" escaped="&amp;lt;" />
    <entity value="&gt;" escaped="&amp;gt;" />
    <entity value="&apos;" escaped="&amp;apos;" />
  </xsl:variable>
  <xsl:variable name="Entities" select="msxsl:node-set($EntitiesRaw)" />

  <xsl:template name="EscapeText">
    <xsl:param name="text" />

    <xsl:variable name="foundEntity" select="$Entities/entity[contains($text, @value)]" />
    <xsl:choose>
      <xsl:when test="$foundEntity">
        <xsl:call-template name="EscapeText">
          <xsl:with-param name="text" select="substring-before($text, $foundEntity/@value)" />
        </xsl:call-template>
        <xsl:value-of select="$foundEntity/@escaped" />
        <xsl:call-template name="EscapeText">
          <xsl:with-param name="text" select="substring-after($text, $foundEntity/@value)" />
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$text"/>
      </xsl:otherwise>
    </xsl:choose>

  </xsl:template>

変数でエスケープしたい XML を作成し、それをテンプレートで実行するだけです。

  <xsl:template match="something">
    <requestXml>
    <xsl:variable name="requestXml">
      <ISD_XMLGateway>
        <Entity><xsl:value-of select="2 + 5" /></Entity>
        <Origin>5 &lt; 6 and 7 > 2</Origin>
        <xsl:apply-templates select="otherStuff" />
        <ElementWithAttributes a="10" b="12" />
      </ISD_XMLGateway>
    </xsl:variable>

    <xsl:apply-templates select="msxsl:node-set($requestXml)" mode="escape" />
    </requestXml>
  </xsl:template>

上記では msxsl:node-set() を 2 か所で使用していますが、MS 以外のほとんどの XSL エンジンには、その関数と同等のものがあると思います。

于 2013-01-04T19:08:01.057 に答える