使用XSLT将XML转换为VXML

时间:2012-05-22 16:08:48

标签: xml xslt

我是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 =&#34; myProj_xsl.xsl&#34;

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

2 个答案:

答案 0 :(得分:1)

您是否尝试通过在Web浏览器中打开XML来处理转换?

如果您是,您所看到的是浏览器尝试在转换完成后呈现输出。由于浏览器不知道如何显示vxml,因此只能看到文本节点。

使用XSLT处理器有什么用处。我推荐Saxon。 Saxon-HE非常适合您入门。文档应该可以轻松地从命令行运行转换。

我添加了另一个可以使用的XSLT 1.0示例。最重要的部分是身份模板。这将按原样复制所有节点(文本/元素/注释/处理指令)和属性而不进行修改(只要它们不被另一个模板覆盖)。如果您需要覆盖身份模板,只需添加新模板。

另外,我偷了弗朗西阿维拉的id创作,但使用的是AVT而不是xsl:attribute。我这样做只是为了展示AVT。 AVT也非常方便学习。

XML输入(我从输入中删除了xml-stylesheet PI。如果我没有将其删除,我必须覆盖标识模板以将其删除。)

<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等,请告诉我。

答案 1 :(得分:0)

您需要注意上下文节点。

<xsl:template match="/">表示您的上下文节点是文档。整个节点的值只是文档中所有文本的串联。因此,重复<xsl:value-of select="."/>将为您提供文档中的所有文本两次。

请改为尝试:

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