Saxon是XSLT,XQuery,XPath和XSD的实现。支持最新的W3C标准,包括XSLT 3.0,XQuery 3.1,XPath 3.1和XSD 1.1。开源和商业版都有Java,.NET和C版本。产品集的最新成员是Saxon-JS,这是一个将在大多数浏览器中运行的XSLT运行时。
我每次都必须定期在 1 个文件夹内转换大量 XML 文件(至少 100K)(基本上,来自解压缩的输入数据集),我想学习如何以最有效的方式做到这一点。 .
在 Saxon 中转义 SQL 的最佳方法是什么?可以做这样的事情吗? 在 Saxon 中转义 SQL 的最佳方法是什么?可以做这样的事情吗? <xsl:variable name="sql-value" select="$field-value => org.apache.commons.lang.StringEscapeUtils.escapeSql()"/> 如果是这样,我只需要包含这个 jar 文件吗?或者有更好的办法吗? 使用 Saxon-PE 或 -EE,您可以直接从 XPath 表达式调用 Java 方法。这些被称为“自反扩展函数”,并在 https://www.saxonica.com/documentation12/index.html#!extensibility/extension-functions-J/reflexive-functions 进行了描述。 我还没有设法追踪 org.apache.commons.lang.StringEscapeUtils.escapeSql() 的规范,但如果它是一个简单的静态方法,采用字符串参数并返回字符串结果,那么你可以将其称为: select="$field-value => Q{java:org.apache.commons.lang.StringEscapeUtils}escapeSql()"/> 如果您想使用开源 Saxon-HE 来做到这一点,那么您将需要跳过更多的麻烦并编写一些 Java 包装器代码:所有内容都在 进行了解释 https://www.saxonica.com/documentation12/index.html#!extensibility/extension-functions-J/ext-simple-J
XQuery 添加了一个空格,我不明白为什么。我有以下简单查询: 声明选项 saxon:output "method=text"; 1 到 10 内的 $i 返回 concat(".", $i, " ", 100, " ...
当我在 Oxygen 中使用 Saxon 运行以下模板时: 当我在 Oxygen 中使用 Saxon 运行以下模板时: <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:math="http://www.w3.org/2005/xpath-functions/math" exclude-result-prefixes="xs math" expand-text="yes" version="3.0"> <xsl:output indent="yes" method="xml" omit-xml-declaration="no" encoding="utf-8"/> <xsl:template match="/"> <xsl:text>
</xsl:text> <xsl:apply-templates select="*"/> </xsl:template> <xsl:template match="*"> <!-- On Martin's suggestion I should use node-name instead of name, so I have changed this, but the result is the same. --> <xsl:value-of select="node-name()"/><xsl:text>
</xsl:text> <xsl:apply-templates select="*"/> </xsl:template> </xsl:stylesheet> 在此 xml 上: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ddn PUBLIC "-//S1000D//DTD Data Dispatch Note 20050501//EN//XML" "http://www.s1000d.org/s1000d_2-2/xml_dtd/ddn/dtd/ddn.dtd"> <ddn> <ddnc> <modelic>ABC</modelic> <sendid>AASSD</sendid> <recvid>VVBBN</recvid> <diyear>2024</diyear> <seqnum>00001</seqnum> </ddnc> </ddn> 我得到以下输出: <?xml version="1.0" encoding="utf-8"?> ddn ddnc modelic sendid recvid diyear seqnum 很明显(至少对我来说),变换知道元素名称。 如果我将与元素匹配的模板更改为: <xsl:template match="ddn"> <xsl:value-of select="node-name()"/><xsl:text>
</xsl:text> <xsl:apply-templates select="*"/> </xsl:template> 我得到以下内容,其中不包含任何元素名称: <?xml version="1.0" encoding="utf-8"?> ABC AASSD VVBBN 2024 0000 如果我删除文档类型声明并运行相同的转换,我会得到: <?xml version="1.0" encoding="utf-8"?> ddn ABC AASSD VVBBN 2024 00001 现在已经找到root ddn了。 结论是dtd被转换使用了。 我宁愿忽略 dtd,也不愿尝试纠正其中的某些内容,因为 dtd 本来就不是我的。我只需要转换我得到的文件的内容,而这个问题中包含的xml只是实际文件的一小部分,但无论内容是什么,问题都是一样的。 那么我该如何解决这个问题呢?我是否需要在我的规则中添加一些命名空间(尽管 name 函数没有产生类似的东西),或者我可以告诉 Saxon 忽略 dtd 吗?看起来好像这是设置中的默认设置,但我怀疑这里还缺少其他东西。 我已经尝试使用带有内置 xslt 引擎的 XMLSpy 进行相同的转换,并且其行为方式相同。 如果我像这样添加 * 作为命名空间: 如果我将与元素匹配的模板更改为: <xsl:template match="*:ddn"> <xsl:value-of select="node-name()"/><xsl:text>
</xsl:text> <xsl:apply-templates select="*"/> </xsl:template> 我得到: <?xml version="1.0" encoding="utf-8"?> ddn ABC AASSD VVBBN 2024 00001 所以这可行,但是为什么?!? 建议? 我下载了一些 DTD,它有 <!ELEMENT ddn (rdf:Description?,ddnc,issdate,security,datarest?, dispto,dispfrom,authrtn,mediaid?,remarks?,delivlst?) > <!ATTLIST ddn id ID #IMPLIED xmlns CDATA #FIXED "http://www.s1000d.org/ddn" %RDFDCATT; > 因此,基于此,对于任何非前缀元素,我希望在 XSLT 中声明 xpath-default-namespace="http://www.s1000d.org/ddn" 允许您选择和/或匹配 ddn、ddnc、issdate 等元素。
我用蜡染生成svg。 然后我通过加载 svg 进行一些后期处理,修改它,然后将其保存回文件。 公共无效doStuff(文件源F,文件目的地){
我正在构建一个报告,该报告将显示与一组 XPath 匹配的 XML 元素的行号。我需要支持 XPath 2.0。将 XML 发送到用 Java 或 C 编写的单独的基于 Web 的处理器...
我想使用java将导入语句添加到现有的schema/xsd文件中,我们是否可以将它们添加到xsd中?,我确实尝试了如下但收到错误:“org.w3c.dom.DOMException:
这是我的代码示例。我想在转换 XML 文档时使用多个文档。因此,我将它们作为参数传递给我的 XSLT 文件。问题是我无法从中选择 XML 标签...
Saxon、XSLT:处理复杂树结构中的数千个 xml 文件
我使用一个 python 脚本来迭代复杂的树结构中的数千个 xml 文件,并执行以下 Saxon 命令: java -cp C:\saxon\SaxonHE10-6J\saxon-he-10.6.jar net.sf.saxon.
SAXON XSLT 3.0 无法在生成的 <rdf:RDF /> 输出中生成 xml:base 属性
我正在使用 SAXON 和 XSL 3.0 转换来生成 RDF 文件作为我的目标输出。根据 W3C RDF 规范,为了正确解析相对 IRI,我需要在通用中指定一个 xml:base URI...
SAXON XLST 3.0 无法在生成的 <rdf:RDF /> 输出中生成 xml:base 属性
我正在使用 SAXON 和 XSL 3.0 转换来生成 RDF 文件作为我的目标输出。根据 W3C RDF 规范,为了正确解析相对 IRI,我需要在通用中指定一个 xml:base URI...
Xpath。使用 fn:collection() 和 fn:base-uri() 获取 JSON 文件的 URI
我有一个包含多个 json 文件 (.json) 的文件夹。任务是获取文件夹中每个 json 文件的 uri。我在 xslt 文件中使用 fn:collection 和 fn:base-uri 。但是当我退出时我收到错误...
XSLT for-each-group group-starting-with tail(current-group())
这是 Martin Honnen 的回答的后续内容。 这是我对他的建议的尝试: XSLT 小提琴链接 在电子表格形式中,数据如下所示: 在 XML 中,这是数据输入: <
Saxon XSLT 可以将 XML 保存到 eXist-db 吗?
Saxon XSLT 可以将 XML 保存到 eXist-db 吗?我搜索了文档和论坛,但找不到任何明确记录的内容。我可以使用 doc('http://localhost:8080/exist/rest...
是否可以仅合并通过 xinclude 添加到 XML 的元素的一部分?
我有一个 XInclude,我正在将其合并到我的 XML 中,以便不必重复内容。这对于我的大多数用途都很有效,但在特定情况下,对象略有不同。那个...
我正在尝试使用 XSL-T 处理充满 SVG 文件的目录。我目前已经尝试过: 我正在尝试使用 XSL-T 处理充满 SVG 文件的目录。我目前已经尝试过: <?xml version="1.0"?> <xsl:stylesheet version="2.0" xmlns="http://www.w3.org/2000/svg" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xpath-default-namespace="http://www.w3.org/2000/svg" exclude-result-prefixes="xsl"> <xsl:output method="xml" doctype-public="-//W3C//DTD SVG 1.1//EN http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"/> <xsl:strip-space elements="*"/> <xsl:template name="main"> <svg xmlns="http://www.w3.org/2000/svg"> <defs/> <xsl:apply-templates select="collection(concat(resolve-uri('src/images'),'?select=*.svg;content-type=application/xml'))"/> </svg> </xsl:template> <xsl:template match="/"> <xsl:apply-templates select="svg"/> </xsl:template> <xsl:template match="svg"> <xsl:element name="symbol"> <xsl:attribute name="id"><xsl:value-of select="tokenize(document-uri(/),'/')[last()]"/></xsl:attribute> <xsl:attribute name="viewBox"><xsl:value-of select="@viewBox"/></xsl:attribute> <xsl:apply-templates select="path"/> </xsl:element> </xsl:template> <xsl:template match="path"> <xsl:element name="path"> <xsl:apply-templates select="@d,@fill"/> </xsl:element> </xsl:template> <xsl:template match="@d"> <xsl:attribute name="d"><xsl:value-of select="."/></xsl:attribute> </xsl:template> <xsl:template match="@fill"> <xsl:attribute name="fill"><xsl:value-of select="."/></xsl:attribute> </xsl:template> </xsl:stylesheet> 从命令行使用它:java net.sf.saxon.Transform -it:main -xsl:"%XSL%\svg-sprite.xsl" -o:"%OUT%\sprite.svg" 它已经非常接近工作了,但我需要获取包含的 SVG 文件的文件名,以用作 id 元素上的 <symbol> 属性。 我尝试了几种构造,使用 <xsl:for-each 而不是 <xsl:apply-templates 以及我能想到的其他所有内容,但我就是无法让它访问文件名。任何帮助将不胜感激。 我假设您对 document-uri 的尝试失败了,这是 Saxon 中的一个已知问题,因为规范的各种要求使得 Saxonica 改变了其实现;正在进行的 XPath 4 工作中存在一个放宽要求的问题,以便恢复 document-uri 的功能。 但在大多数使用情况下base-uri会这样做,尝试一下。 作为替代方案,您可以从 uri-collection 而不是 collection 开始,然后直接获得每个集合的 URI,您可以轻松提取其中的文件名,并使用 doc($uri) 处理文档,例如apply-templates。
我正在尝试使用 XSL-T 处理充满 SVG 文件的目录。我目前已经尝试过: 我正在尝试使用 XSL-T 处理充满 SVG 文件的目录。我目前已经尝试过: <?xml version="1.0"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" doctype-public="-//W3C//DTD SVG 1.1//EN http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"/> <xsl:strip-space elements="*"/> <xsl:template name="main"> <svg xmlns="http://www.w3.org/2000/svg"> <defs/> <xsl:apply-templates select="collection(concat(resolve-uri('src/images'),'?select=*.svg;content-type=application/xml'))"/> </svg> </xsl:template> <xsl:template match="/"> <xsl:message>root</xsl:message> <xsl:apply-templates select="svg"/> </xsl:template> <xsl:template match="svg"> <xsl:message>svg</xsl:message> <xsl:attribute name="id"><xsl:value-of select="document-uri(/)"/></xsl:attribute> <xsl:attribute name="viewBox"><xsl:value-of select="@viewBox"/></xsl:attribute> <xsl:apply-templates select="path"/> </xsl:template> <xsl:template match="path"> <xsl:message>path</xsl:message> <xsl:attribute name="d"><xsl:value-of select="@d"/></xsl:attribute> <xsl:apply-templates select="@*"/> </xsl:template> <xsl:template match="@fill"> <xsl:message>@fill</xsl:message> <xsl:attribute name="fill"><xsl:value-of select="."/></xsl:attribute> </xsl:template> </xsl:stylesheet> 从命令行使用它: java net.sf.saxon.Transform -it:main -xsl:"%XSL%\svg-sprite.xsl" -o:"%OUT%\sprite.svg" 但是,当我在包含 29 个 SVG 文件的目录上运行它时,我得到的只是打印出 29 个 root。由于某种原因,<xsl:apply-templates select="svg"/> 似乎不起作用。 有谁知道如何解决这个困境,或者至少知道如何弄清楚为什么它没有应用定义的svg模板? 在 XSLT 的根元素上添加 xpath-default-namespace="http://www.w3.org/1999/svg"。基本上是 SVG 命名空间,我希望我已经记住并输入了正确的内容。
我正在 XML 文件上使用 XQuery,并且需要 Python 本机格式的输出。按照文档,我尝试执行下面的代码,但是,我得到的输出位于 我正在 XML 文件上使用 XQuery,并且需要 Python 本机格式的输出。按照文档,我尝试执行下面的代码,但是,我得到的输出是 <class 'saxonche.PyXdmValue'>,并且我正在努力将其转换为本机 Python 数据类型。 from saxonche import * P = PyXQueryProcessor(license=False) Q = P.new_xquery_processor() Q.set_context(file_name="data.xml") res = Q.run_query_to_value(query_text=qry_str) 如何将响应类型(<class 'saxonche.PyXdmValue'>)转换为Python本机容器? 正如我在评论中所说,PyXdmValue表示 XDM 3.1 项目的 XDM 3.1 序列,这些项目可以是各种不同的类型,例如 XDM 节点、XDM 原子值(不同类型,例如字符串、布尔值、各种数字类型) ,各种日期/日期时间/持续时间类型)和功能项(包括地图和数组)。 因此,根据您的查询,您需要编写代码,考虑结果结构和项目类型。 举一个例子,查询 declare namespace map = 'http://www.w3.org/2005/xpath-functions/map'; declare namespace output = 'http://www.w3.org/2010/xslt-xquery-serialization'; declare option output:method 'adaptive'; map:merge( for $city in //city group by $country := $city/@country, $name := $city/@name return map:entry($name || '(' || $country || ')', avg($city/@pop)) ) 计算一个国家/地区某个城市的平均人口,并将结果作为包含 xs:string 键值和 xs:double 属性值的 XDM 地图返回。 输入文件示例如下 <cities> <city name="Milano" country="Italia" year="1950" pop="5.23"/> <city name="Milano" country="Italia" year="1960" pop="5.29"/> <city name="Padova" country="Italia" year="1950" pop="0.69"/> <city name="Padova" country="Italia" year="1960" pop="0.93"/> <city name="Paris" country="France" year="1951" pop="7.2"/> <city name="Paris" country="France" year="1961" pop="7.6"/> </cities> 在 Python 中,您可以将返回的 PyXdmMap 作为 [0] 的第一项 PyXdmValue 进行访问,例如使用字典理解将该 PyXdmMap 转换为 Python 字典: from saxonche import PySaxonProcessor with PySaxonProcessor() as saxon_proc: print(saxon_proc.version) xquery_processor = saxon_proc.new_xquery_processor() xquery_processor.set_context(file_name='cities2.xml') xdm_result1 = xquery_processor.run_query_to_value(query_file='group_cities2.xq') print(xdm_result1) python_dict1 = { key.string_value : xdm_result1[0].get(key)[0].double_value for key in xdm_result1[0].keys()} print(python_dict1) 输出例如 SaxonC-HE 12.4 from Saxonica map{"Milano(Italia)":5.26e0,"Paris(France)":7.4e0,"Padova(Italia)":8.1e-1} {'Milano(Italia)': 5.26, 'Paris(France)': 7.4, 'Padova(Italia)': 0.81}
在javascript中,如果当前线程已经是非主线程,我想执行一个操作,或者如果当前线程是主线程,则将其传递给非主线程。 为此,我如何测试是否...
当一个值未定义时,如何处理 Saxon XQuery 处理器返回的多个值?
我正在尝试在 Java 应用程序中使用 Saxon HE XQuery 处理器对 XML 文档执行即席查询。 例如: 对于 $x //TestHistory[last()]/results/TestResult 其中 $x/status = 'TestedF...