如何使用 XSLT saxonica 将 xml 转换为点?

How to convert xml to dot using XSLT saxonica?

I have an xml code as shown below, The xml contains several elements, namely: id, parent menu, label, role id, role and items. in items there is 1 element, namely submenu, and in submenu there are 2 elements, namely url and label:

<?xml version="1.0" encoding="UTF-8"?>
<Import>
    <Row>
        <id>1</id> //this the id
        <parentmenu>siasn-instansi</parentmenu> //this is the parent menu
        <label>Layanan Profile ASN</label> //this is the label
        <role_id>1</role_id> //this is the role id
        <role>role:siasn-instansi:profilasn:viewprofil</role> //this is the role
        <items>
            <subMenu name = "pns"> //this is the Sub menu
                 <url>/tampilanData/pns</url> //this is the url
                 <label>Profile Pegawai</label> //this is the label
            </subMenu>
            <subMenu name = "pppk"> //this is the Sub menu
                 <url>/tampilanData/pppk</url> //this is the parent menu
                 <label>Profile Pegawai PPPK</label> //this is the label
            </subMenu>
            <subMenu name = "ppt"> //this is the Sub menu
                 <url>/tampilanData/JPTNonASN</url> //this is the url
                 <label>Profile Pegawai PPT Non-ASN</label> //this is the label
            </subMenu>
        </items>
    </Row>
</Import>

下面的代码是xslt的代码,使用XSL语言和DOT语言规则。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml" xmlns:dotml="http://www.martin-loetzsch.de/DOTML" version="1.0"> //xsl to transform to dot file
    <xsl:template match="/">
        <xsl:for-each select = "Import/Row">
            <graph file-name="graphs/node">  
                <node id="<xsl:value:of select='role'>" label="role:siasn-instansi:profilasn:viewprofil" style="filled" fontsize="16"/> //in this case i wanna take the value in my xml code to take place in id on my element node in xsl
                <node id="<xsl:value:of select='items/subMenu[@name="pns"]/url'>" label="/tampilanData/pns" style="filled" fontsize="16"/>
                <node id="<xsl:value:of select='items/subMenu[@name="pppk"]/url'>" label="/tampilanData/pppk" style="filled" fontsize="16"/>
                <node id="<xsl:value:of select='items/subMenu[@name="ppt"]/url'>" label="/tampilanData/JPTNonASN" style="filled" fontsize="16"/>
                <edge from="<xsl:value:of select='role'>" to="<xsl:value:of select='items/subMenu[@name="pns"]/url'>" fontname="Arial" fontsize="9" label="Permit"/>
                <edge from="<xsl:value:of select='role'>" to="<xsl:value:of select='items/subMenu[@name="pppk"]/url'>" fontname="Arial" fontsize="9" label="Permit"/>
                <edge from="<xsl:value:of select='role'>" to="<xsl:value:of select='items/subMenu[@name="ppt"]/url'>" fontname="Arial" fontsize="9" label="Permit"/>
            </graph>
        <xsl:for-each>    
    </xsl:template>    
</xsl:stylesheet>

xsl有2种元素,即:节点和边。在第一个节点上,我想在 xml 中的角色元素上获取角色值,并且我想将该值分配给我的 xsl 文档中的节点元素。其次,我想获取 xml 文档中 pns 子菜单中 url 元素的 url 值,并且我想将该值分配给我的 xsl 文档中的节点元素。其次,我想获取 xml 文档中 pns 子菜单中 url 元素的 url 值,并且我想将该值分配给我的 xsl 文档中的节点元素。第三,我想获取 xml 文档中 pppk 子菜单中 url 元素的 url 值,并且我想将该值分配给我的 xsl 文档中的节点元素。第四,我想在 xml 文档的 ppt 子菜单中的 url 元素上获取 url 值,并且我想将该值分配给我的 xsl 文档元素中的节点元素.

我有一个问题,当我使用 SAXONICA 转换我的 xml 文档时,我的 XSL 文档中出现错误,如下所示

C:\Users\rafif\Desktop\saxons>java -jar saxon-he-10.6.jar role-policy.xml role-policy.xsl -o:role- policy.dot role-policy.xsl 的第 5 行第 27 列错误:XML 解析器报告的 SXXP0003 错误:与元素类型“node”关联的属性“id”的值不能包含'<' 字符。:与元素类型“node”关联的属性“id”的值不得包含“<”字符。 org.xml.sax.SAXParseException; systemId: 文件:/C:/Users/rafif/Desktop/saxons/role-policy.xsl;行号:5;列数:27;与元素类型“节点”关联的属性“id”的值不得包含“<”字符。

can you help me to fix my XSL code

您不能将一个元素放在另一个元素的开始标记内。而不是:

<node id="<xsl:value:of select='role'>" label="role:siasn-instansi:profilasn:viewprofil" style="filled" fontsize="16"/>

使用其中之一:

<node label="role:siasn-instansi:profilasn:viewprofil" style="filled" fontsize="16">
    <xsl:attribute name="id">
        <xsl:value-of select='role'/>
    </xsl:attribute>
</node> 

或(参见:https://www.w3.org/TR/1999/REC-xslt-19991116/#attribute-value-templates):

<node id="{role}" label="role:siasn-instansi:profilasn:viewprofil" style="filled" fontsize="16"/>

您还需要正确关闭 <xsl:for-each> 元素。