-1

XMLとその関連言語は初めてです。voiceXMLに関連するプロジェクトを実行しようとしています。XSLTを使用してXMLドキュメントをVoiceXMLドキュメントに変換する必要がある場合。xsltを使用して次のXMLファイルを変換しようとしました。しかし、私は次のような出力を受け取っています:「私はここにいます私はここにいません私はここにいます私はここにいません」これを整理するのを手伝ってくれませんか?

前もって感謝します。

XMLファイル="myProj.xml"

<?xml version="1.0" encoding="UTF-8" ?>

<?xml-stylesheet type="text/xsl" href="myProj_xsl.xsl"?>


<myProjtag>
<prompt>
    I am here
</prompt>
<prompt>
    I am not here
</prompt>
</myProjtag>

XSLT file = "myProj_xsl.xsl"

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

<xsl:template match="/">
    <vxml version="2.0" lang="en">
        <form id="myProj">
            <prompt>
                <xsl:value-of select="."/>
            </prompt>
            <prompt>
                <xsl:value-of select="."/>
            </prompt>
        </form>
    </vxml>
</xsl:template> 

</xsl:stylesheet>
4

2 に答える 2

2

WebブラウザーでXMLを開いて変換を処理しようとしていますか?

もしそうなら、あなたが見ているのは、変換が完了した後にブラウザが出力をレンダリングしようとすることです。ブラウザはvxmlの表示方法を認識していないため、テキストノードのみが表示されます。

XSLTプロセッサを使用すると便利です。Saxonをお勧めします。Saxon-彼はあなたが始めるのに最適でしょう。ドキュメントでは、コマンドラインから変換を簡単に実行できるはずです。

使用できる別のXSLT1.0の例を追加しました。最も重要な部分はIDテンプレートです。これにより、すべてのノード(テキスト/要素/コメント/処理命令)と属性が変更されずにそのままコピーされます(別のテンプレートによってオーバーライドされない限り)。IDテンプレートを上書きする必要がある場合は、新しいテンプレートを追加するだけです。

また、Franci Avilaのid作品を盗みましたが、の代わりにAVTxsl:attributeを使用しました。これは、AVTを表示するためだけに行いました。AVTも学ぶのにとても便利です。

XML入力(入力xml-stylesheetからPIを削除しました。削除しなかった場合は、IDテンプレートをオーバーライドして削除する必要があります。)

<myProjtag>
  <prompt>I am here</prompt>
  <prompt>I am not here</prompt>
</myProjtag>

XSLT 1.0

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

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

  <xsl:template match="/">
    <vxml version="2.0" lang="en">
      <form id="{substring(local-name(/*), 0, string-length(local-name(/*))-2)}">
        <xsl:apply-templates select="*/*"/>
      </form>
    </vxml>    
  </xsl:template>

</xsl:stylesheet>

XML出力

<vxml version="2.0" lang="en">
   <form id="myProj">
      <prompt>I am here</prompt>
      <prompt>I am not here</prompt>
   </form>
</vxml>

XSLT、コマンドラインからのSaxonの実行などについて質問がある場合は、お知らせください。

于 2012-05-23T05:50:44.493 に答える
0

コンテキストノードに注意を払う必要があります。

<xsl:template match="/">コンテキストノードがドキュメントであることを意味します。ノード全体の値は、ドキュメント内のすべてのテキストを連結したものにすぎません。したがって、Willを繰り返す<xsl:value-of select="."/>と、ドキュメント内のすべてのテキストが2回表示されます。

代わりにこれを試してください:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

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


<xsl:template match="/*">
<form>
   <xsl:attribute name="id">
      <xsl:value-of select="substring(local-name(), 0, string-length(local-name())-2)"/>
   </xsl:attribute>
   <!-- * is prompt elements -->
   <xsl:apply-templates select="*"/>
</form>
</xsl:template>


<xsl:template match="/">
    <vxml version="2.0" lang="en">
            <!-- * is myProjTag element -->
            <xsl:apply-templates select="*"/>
    </vxml>
</xsl:template> 
</xsl:stylesheet>
于 2012-05-22T16:36:47.797 に答える