使用xslt转换将一些元素嵌套到<div> </div>标签中

时间:2019-08-06 10:01:10

标签: html xml xslt attributes

我是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”必须以匹配的结束标记终止   “

”。

我可能了解什么地方出了问题,但是我不知道如何解决。 请给我一些建议吗? 谢谢。

1 个答案:

答案 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>
相关问题
最新问题