1

私はいくつかのXMLのようなものを持っています

<ITEM><TITLE>Video: High Stakes for <KW>Obama</KW> &amp; Romney</TITLE></ITEM>

XSLTを使用して以下のXMLに変換したいと思います。

<ITEM><TITLE>Video: High Stakes for &lt;KW&gt;Obama&lt;/KW&gt; &amp; Romney</TITLE></ITEM>

試してみ<xls:copy-of select="./TITLE"/>ましたが、XML タグをエスケープしていません。何か案が?

4

2 に答える 2

2

これらの種類の質問は、常に多くの競合する回答を引き付けます。これは、最良の回答は、必要な一般化の程度によって異なり、質問からは明らかではないためです。

超一般的なソリューションが必要な場合は、通常のXSLTSOスターにお任せします。または、XMLをシリアル化/文字列化する方法を尋ねる質問をSOで検索することもできます。たくさんあります。

私はあなたの質問の非常に狭い解釈のために、あなたに非常に単純ですが具体的な解決策を提供します。このために私はそれを仮定します:

  1. 要素のコンテンツをシリアル化することに関心がありTITLEます。
  2. KW`)の要素の子はTITLE' (such as、子も属性も持たず、名前空間にないという点で制限されています。

この解釈で、この入力ドキュメント...

<ITEM>
 <TITLE>Video: High Stakes for <KW>Obama</KW> &amp; Romney</TITLE>
</ITEM>

...このXSLT1.0スタイルシートによって変換されました(2.0でも同じように機能します)...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*" />  

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

<xsl:template match="TITLE/*">
  <xsl:value-of select="concat('&lt;',name(),'&gt;',.,'&lt;/',name(),'&gt;')" />
</xsl:template>

</xsl:stylesheet>

...収量..。

<ITEM>
  <TITLE>Video: High Stakes for &lt;KW&gt;Obama&lt;/KW&gt; &amp; Romney</TITLE>
</ITEM>
于 2012-10-08T00:14:14.330 に答える
0

XSLT には、マークアップをテキストに破棄するための特定の直接的な機能はありません (これが実際に役立つかどうかをよく考える必要があります)。

これは、小さな C# 拡張関数を使用した短い解決策です(同様の拡張関数は、他のほとんどの PL およびプラットフォームで簡単に記述できます)。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:msxsl="urn:schemas-microsoft-com:xslt"
 xmlns:my="my:my" exclude-result-prefixes="msxsl my">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

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

 <xsl:template match="/*/TITLE/*">
  <xsl:value-of select="my:stringize(.)"/>
  <xsl:apply-templates/>
 </xsl:template>

 <msxsl:script language="c#" implements-prefix="my">
  public string stringize(XPathNavigator doc)
  {
   return doc.OuterXml;
  }
 </msxsl:script>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると、次のようになります。

<ITEM><TITLE>Video: High Stakes for <KW>Obama</KW> &amp; Romney</TITLE></ITEM>

必要な正しい結果が生成されます。

<ITEM>
  <TITLE>Video: High Stakes for &lt;KW&gt;Obama&lt;/KW&gt; &amp; Romney</TITLE>
</ITEM>

注意してください:

  1. TITLEこのソリューションは、深さに関係なく、XML ドキュメントの最上位要素の子である要素に根ざしたサブツリー全体をテキストにフラット化しますが、他の投稿された回答ではそうではありません。

  2. このソリューションは、属性または空の要素を持つ要素を正しく平坦化しますが、他の投稿された回答ではそうではありません。

于 2012-10-08T00:34:38.633 に答える