如何将 XSL 文档中的值转换为字符串以及如何在使用 saxon 解析 xsl 文件后删除 <dot-filename>graphs/node</dot-filename> 标

Posted

技术标签:

【中文标题】如何将 XSL 文档中的值转换为字符串以及如何在使用 saxon 解析 xsl 文件后删除 <dot-filename>graphs/node</dot-filename> 标记?【英文标题】:how to make a value in XSL document to string and how to remove <dot-filename>graphs/node</dot-filename> tag after parsing xsl file using saxon? 【发布时间】:2021-12-31 20:06:39 【问题描述】:

这是我的 xsl 代码

    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.martin-loetzsch.de/DOTML" version="3.0">
    <xsl:import href="http://www.martin-loetzsch.de/DOTML/dotml2dot.xsl"/><xsl:param name="quot" as="xs:string">"</xsl:param>
    <xsl:output method="text"/>
    <xsl:template match="/">
        <xsl:variable name="dotml">
          <xsl:for-each select = "Import/Row">
                <node style="filled" fontsize="16">
                    <xsl:attribute name="id">
                        <xsl:value-of select='$quot || role || $quot'/>
                    </xsl:attribute>
                    <xsl:attribute name="label">
                        <xsl:value-of select='$quot || role || $quot'/>
                    </xsl:attribute>
                </node>   
                <node style="filled" fontsize="16">
                    <xsl:attribute name="id">
                        <xsl:value-of select='$quot || items/subMenu[@name="pns"]/url || $quot'/>
                    </xsl:attribute>
                    <xsl:attribute name="label">
                        <xsl:value-of select='$quot || items/subMenu[@name="pns"]/url || $quot'/>
                    </xsl:attribute>
                </node>   
                <node style="filled" fontsize="16">
                    <xsl:attribute name="id">
                        <xsl:value-of select='$quot || items/subMenu[@name="pppk"]/url || $quot'/>
                    </xsl:attribute>
                    <xsl:attribute name="label">
                        <xsl:value-of select='$quot || items/subMenu[@name="pppk"]/url || $quot'/>
                    </xsl:attribute>
                </node>   
                <node style="filled" fontsize="16">
                    <xsl:attribute name="id">
                        <xsl:value-of select='$quot || items/subMenu[@name="ppt"]/url || $quot'/>
                    </xsl:attribute>
                    <xsl:attribute name="label">
                        <xsl:value-of select='$quot || items/subMenu[@name="ppt"]/url || $quot'/>
                    </xsl:attribute>
                </node>  

                <edge fontname="Arial" fontsize="9" label="Permit">
                    <xsl:attribute name="from">
                        <xsl:value-of select='$quot || role || $quot'/>
                    </xsl:attribute>
                    <xsl:attribute name="to">
                        <xsl:value-of select='$quot || items/subMenu[@name="pns"]/url || $quot'/>
                    </xsl:attribute>
                </edge>   
                <edge fontname="Arial" fontsize="9" label="Permit">
                    <xsl:attribute name="from">
                        <xsl:value-of select='$quot || role || $quot'/>
                    </xsl:attribute>
                    <xsl:attribute name="to">
                        <xsl:value-of select='$quot || items/subMenu[@name="pppk"]/url || $quot'/>
                    </xsl:attribute>
                </edge>   
                <edge fontname="Arial" fontsize="9" label="Permit">
                    <xsl:attribute name="from">
                        <xsl:value-of select='$quot || role || $quot'/>
                    </xsl:attribute>
                    <xsl:attribute name="to">
                        <xsl:value-of select='$quot || items/subMenu[@name="ppt"]/url || $quot'/>
                    </xsl:attribute>
                </edge>   
          
          </xsl:for-each>         
        </xsl:variable>
        <xsl:apply-templates select="$dotml/node()"/>
      
    </xsl:template>    
</xsl:stylesheet>

我遵循了您的建议,在上面的 xsl 文档的第 3 行添加了 标记。我把标记我的 xsl 文档中的每个值,以检索我的 xsl 文档中的值,以便该值变为字符串

当我运行代码时出现如下错误:

C:\Users\rafif\Desktop\saxons&gt;java -jar saxon-he-10.6.jar -xsl:role policy.xsl -s:role-policy.xml -o:policy.txtError in xsl:param/@as on line 3 column 113 of role-policy.xsl:XPST0081 Namespace prefix 'xs' has not been declaredErrors were reported during stylesheet compilation

问题是,我应该把&lt;xsl:param name="quot" as="xs:string"&gt;"&lt;/xsl:param&gt;标签放在哪里,因为我试图把标签放在第3行,出现错误

谢谢

【问题讨论】:

【参考方案1】:

好吧,您使用的样式表似乎没有创建您想要的格式或您的其他程序需要的格式,所以放弃该样式表并编写自己的或至少编辑它以不创建例如&lt;dot-filename&gt;graphs/node&lt;/dot-filename&gt;,即从该代码中删除具有&amp;lt;dot-filename&amp;gt;&lt;xsl:value-of select="@file-name"/&gt;&amp;lt;/dot-filename&amp;gt; 的行。

您可以轻松地为文件的本地副本和&lt;xsl:import href="dotml2dot.xml"/&gt; 该本地副本执行此操作,而不是从服务器中提取文件。

至于引号,您似乎想转换例如&lt;xsl:value-of select='items/subMenu[@name="pns"]/url'/&gt; 例如&lt;xsl:value-of select='$quot || items/subMenu[@name="pns"]/url || $quot'/&gt; after declaring e.g. ` 作为全局参数。

【讨论】:

我输入全局参数的位置: ? 你能给我举个例子吗?关于全局参数 您作为xsl:stylesheet 的直接子项编写的XSLT 文档中的任何位置,例如&lt;xsl:import href="..."/&gt;&lt;xsl:param name="quot" as="xs:string"&gt;"&lt;/xsl:param&gt; 我已经编辑了我上面的问题,你能帮我吗,你可以看到我所有的 xsl 代码,我已经按照你的建议,但仍然有错误,请你帮我..谢谢 我告诉过您放弃导入或使用本地副本删除您似乎不想生成的代码。您当前使用&lt;xsl:import href="http://www.martin-loetzsch.de/DOTML/dotml2dot.xsl"/&gt; 进行的编辑表明您仍在使用来自服务器的原始文件。当然,如果您使用as="xs:string",您还需要在xsl:stylesheet 上声明xmlns:xs="http://www.w3.org/2001/XMLSchema",以达到最低限度的意义。【参考方案2】:

这是正确的答案...

 <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.martin-loetzsch.de/DOTML" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="3.0">
        <xsl:import href="dotml2dot.xsl"/>
        <xsl:param name="quot" as="xs:string">"</xsl:param>
        <xsl:output method="text"/>
        <xsl:template match="/">
            <xsl:variable name="dotml">
              <xsl:for-each select = "Import/Row">
                <graph  file-name="graphs/nice_graph" rankdir="LR">
                    <node style="filled" fontsize="16">
                        <xsl:attribute name="id">
                            <xsl:value-of select='$quot || role || $quot'/>
                        </xsl:attribute>
                        <xsl:attribute name="label">
                            <xsl:value-of select='role'/>
                        </xsl:attribute>
                    </node>   
                    <node style="filled" fontsize="16">
                        <xsl:attribute name="id">
                            <xsl:value-of select='$quot || items/subMenu[@name="pns"]/url || $quot'/>
                        </xsl:attribute>
                        <xsl:attribute name="label">
                            <xsl:value-of select='items/subMenu[@name="pns"]/url'/>
                        </xsl:attribute>
                    </node>   
                    <node style="filled" fontsize="16">
                        <xsl:attribute name="id">
                            <xsl:value-of select='$quot || items/subMenu[@name="pppk"]/url || $quot'/>
                        </xsl:attribute>
                        <xsl:attribute name="label">
                            <xsl:value-of select='items/subMenu[@name="pppk"]/url'/>
                        </xsl:attribute>
                    </node>   
                    <node style="filled" fontsize="16">
                        <xsl:attribute name="id">
                            <xsl:value-of select='$quot || items/subMenu[@name="ppt"]/url || $quot'/>
                        </xsl:attribute>
                        <xsl:attribute name="label">
                            <xsl:value-of select='items/subMenu[@name="ppt"]/url'/>
                        </xsl:attribute>
                    </node>  
    
                    <edge fontname="Arial" fontsize="9" label="Permit">
                        <xsl:attribute name="from">
                            <xsl:value-of select='$quot || role || $quot'/>
                        </xsl:attribute>
                        <xsl:attribute name="to">
                            <xsl:value-of select='$quot || items/subMenu[@name="pns"]/url || $quot'/>
                        </xsl:attribute>
                    </edge>   
                    <edge fontname="Arial" fontsize="9" label="Permit">
                        <xsl:attribute name="from">
                            <xsl:value-of select='$quot || role || $quot'/>
                        </xsl:attribute>
                        <xsl:attribute name="to">
                            <xsl:value-of select='$quot || items/subMenu[@name="pppk"]/url || $quot'/>
                        </xsl:attribute>
                    </edge>   
                    <edge fontname="Arial" fontsize="9" label="Permit">
                        <xsl:attribute name="from">
                            <xsl:value-of select='$quot || role || $quot'/>
                        </xsl:attribute>
                        <xsl:attribute name="to">
                            <xsl:value-of select='$quot || items/subMenu[@name="ppt"]/url || $quot'/>
                        </xsl:attribute>
                    </edge>   
                </graph>
              </xsl:for-each>         
            </xsl:variable>
            <xsl:apply-templates select="$dotml/node()"/>
          
        </xsl:template>    
    </xsl:stylesheet>

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于如何将 XSL 文档中的值转换为字符串以及如何在使用 saxon 解析 xsl 文件后删除 <dot-filename>graphs/node</dot-filename> 标的主要内容,如果未能解决你的问题,请参考以下文章

XSLT 中的十进制格式以及字符

C# 中的 XSLT 转换 - 如何获取包含文档的有效 URL?

如何将整个 Bson 文档转换为 dotnet 中的字符串

如何使用 XSLT 将字符串转换为大写或小写?

XSLT

XSLT:如何将 XML 节点转换为字符串