-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 文件="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-HE 将是您入门的完美选择。该文档应该很容易让您从命令行运行转换。

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

另外,我偷了 Franci Avila 的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 等有任何疑问,请告诉我。

于 2012-05-23T05:50:44.493 回答
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>
于 2012-05-22T16:36:47.797 回答