我是XSLT的新手。我想使用xslt将xml转换为html。我想添加div元素,其中将根据条件嵌套一些属性。
我有以下xml:
<xml version="1.0" encoding="UTF-8"?>
<ns:form xmlns:ns="http://abcdefghij/datatypes/">
<ns:sectors>
<ns:sector>
<ns:sectorID>Title</ns:sectorID>
<ns:controls>...</ns:controls>
</ns:sector>
<ns:sector>
<ns:sectorID>Image1</ns:sectorID>
<ns:controls>...</ns:controls>
</ns:sector>
<ns:sector>
<ns:sectorID>Content1</ns:sectorID>
<ns:controls>...</ns:controls>
</ns:sector>
<ns:sector>
<ns:sectorID>Links</ns:sectorID>
<ns:controls>...</ns:controls>
</ns:sector>
<ns:sector>
<ns:sectorID>Buttons</ns:sectorID>
<ns:controls>...</ns:controls>
</ns:sector>
</ns:sectors>
</ns:form>
我想得到:
<div id="sablona1" class="override-ckeditor">
<div id="Title">...</div>
<div>
<div id="Image1">...</div>
<div id="Content1">...</div>
<div id="Links">...</div>
</div>
<div id="Buttons">...</div>
</div>
我尝试过这个xslt:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns="http://abcdefghij/datatypes/" xmlns:xls="http://www.w3.org/1999/XSL/Transform" exclude-result-prefixes="ns">
<xsl:output method="html" />
<xsl:template match="/ns:form">
<div id="sablona1" class="override-ckeditor">
<xsl:for-each select="ns:sectors/ns:sector">
<!-- starts the code, which is not working -->
<xsl:choose>
<xsl:when test="ns:sectorID = 'Image1'">
<div>
</xsl:when>
<xsl:when test="ns:sectorID = 'Buttons'">
</div>
</xsl:when>
</xsl:choose>
<!-- ends the code, which is not working -->
<div>
<xsl:attribute name="id">
<xsl:value-of select="ns:sectorID"/>
</xsl:attribute>
<xsl:apply-templates select="ns:controls"/>
</div>
</xsl:for-each>
</div>
</xsl:template>
</xsl:stylesheet>
但是它返回错误:
无法使用提供的XML / XSL输入生成XML文档。 org.xml.sax.SAXParseException; lineNumber:11; columnNumber:23;的 元素类型“ div”必须以匹配的结束标记终止 “
我可能了解什么地方出了问题,但是我不知道如何解决。 请给我一些建议吗? 谢谢。
答案 0 :(得分:1)
XSLT不是文字处理器。它适用于节点树,而不适用于单个标签。 XSLT样式表也必须是格式正确的XML文档。
尝试其他方法:
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ns="http://abcdefghij/datatypes/"
exclude-result-prefixes="ns">
<xsl:output method="html"/>
<xsl:template match="/ns:form">
<div id="sablona1" class="override-ckeditor">
<div id="Title">
<xsl:value-of select="ns:sectors/ns:sector[1]/ns:controls"/>
</div>
<div>
<xsl:for-each select="ns:sectors/ns:sector[position() > 1]">
<div id="{ns:sectorID}">
<xsl:value-of select="ns:controls"/>
</div>
</xsl:for-each>
</div>
</div>
</xsl:template>
</xsl:stylesheet>
或者,如果您愿意:
<xsl:template match="/ns:form">
<div id="sablona1" class="override-ckeditor">
<div id="Title">
<xsl:value-of select="ns:sectors/ns:sector[ns:sectorID = 'Title']/ns:controls"/>
</div>
<div>
<xsl:for-each select="ns:sectors/ns:sector[ns:sectorID !='Title']">
<div id="{ns:sectorID}">
<xsl:value-of select="ns:controls"/>
</div>
</xsl:for-each>
</div>
</div>
</xsl:template>