我是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>
答案 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>