如何将SVRL报告中failed-assert的location转为命名空间前缀格式?
问题描述
使用SaxonCS配合schxslt编译的XSL文件验证XML后,生成的SVRL报告中,svrl:failed-assert元素的location属性采用Q{命名空间URI}格式,示例如下:
<svrl:failed-assert location="/Q{http://www.edefter.gov.tr}defter[1]/Q{http://www.xbrl.org/2003/instance}xbrl[1]/Q{http://www.xbrl.org/int/gl/cor/2006-10-25}accountingEntries[1]/Q{http://www.xbrl.org/int/gl/cor/2006-10-25}entryHeader[298]" test="some-test"> <svrl:text>some-message</svrl:text> </svrl:failed-assert>
需要将其转换为带命名空间前缀的格式,目标效果:
<svrl:failed-assert location="/edefter:defter[1]/xbrli:xbrl[1]/gl-cor:accountingEntries[1]/gl-cor:entryHeader[298]" test="some-test"> <svrl:text>some-message</svrl:text> </svrl:failed-assert>
已尝试手动提供命名空间、导入模式,但未找到可行方案。附编译前后的命名空间信息:
编译前SVRL文件的命名空间
<xsl:transform version="2.0" xmlns="http://www.w3.org/1999/XSL/TransformAlias" xmlns:sch="http://purl.oclc.org/dsdl/schematron" xmlns:error="https://doi.org/10.5281/zenodo.1495494#error" xmlns:schxslt="https://doi.org/10.5281/zenodo.1495494" xmlns:schxslt-api="https://doi.org/10.5281/zenodo.1495494#api" xmlns:svrl="http://purl.oclc.org/dsdl/svrl" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
编译后SVRL报告的命名空间
<svrl:schematron-output xmlns:defterek="http://www.edefter.gov.tr/ek" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:edefter="http://www.edefter.gov.tr" xmlns:error="https://doi.org/10.5281/zenodo.1495494#error" xmlns:gl-bus="http://www.xbrl.org/int/gl/bus/2006-10-25" xmlns:gl-cor="http://www.xbrl.org/int/gl/cor/2006-10-25" xmlns:gl-muc="http://www.xbrl.org/int/gl/muc/2006-10-25" xmlns:gl-plt="http://www.xbrl.org/int/gl/plt/2010-04-16" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sch="http://purl.oclc.org/dsdl/schematron" xmlns:schxslt="https://doi.org/10.5281/zenodo.1495494" xmlns:schxslt-api="https://doi.org/10.5281/zenodo.1495494#api" xmlns:svrl="http://purl.oclc.org/dsdl/svrl" xmlns:xades="http://uri.etsi.org/01903/v1.3.2#" xmlns:xbrli="http://www.xbrl.org/2003/instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" title="Yevmiye defteri dokumanlarını kontrol etmek için gerekli olan schematron kuralları"> <svrl:ns-prefix-in-attribute-values prefix="gl-plt" uri="http://www.xbrl.org/int/gl/plt/2010-04-16"/> <svrl:ns-prefix-in-attribute-values prefix="gl-cor" uri="http://www.xbrl.org/int/gl/cor/2006-10-25"/> <svrl:ns-prefix-in-attribute-values prefix="gl-bus" uri="http://www.xbrl.org/int/gl/bus/2006-10-25"/> <svrl:ns-prefix-in-attribute-values prefix="gl-muc" uri="http://www.xbrl.org/int/gl/muc/2006-10-25"/> <svrl:ns-prefix-in-attribute-values prefix="xbrli" uri="http://www.xbrl.org/2003/instance"/> <svrl:ns-prefix-in-attribute-values prefix="ds" uri="http://www.w3.org/2000/09/xmldsig#"/> <svrl:ns-prefix-in-attribute-values prefix="xades" uri="http://uri.etsi.org/01903/v1.3.2#"/> <svrl:ns-prefix-in-attribute-values prefix="edefter" uri="http://www.edefter.gov.tr"/> <svrl:ns-prefix-in-attribute-values prefix="defterek" uri="http://www.edefter.gov.tr/ek"/>
解决方案
可以编写一个XSLT转换,利用SVRL报告中自带的svrl:ns-prefix-in-attribute-values元素建立命名空间URI与前缀的映射,批量替换location属性中的Q{URI}格式。
转换用XSLT代码
<xsl:transform version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:svrl="http://purl.oclc.org/dsdl/svrl"> <!-- 建立命名空间URI到前缀的映射表 --> <xsl:key name="ns-prefix-map" match="svrl:ns-prefix-in-attribute-values" use="@uri" select="@prefix"/> <!-- 默认模板:复制所有节点和属性 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 专门处理svrl:failed-assert的location属性 --> <xsl:template match="svrl:failed-assert/@location"> <xsl:attribute name="location"> <!-- 正则匹配Q{URI}元素名的格式,替换为前缀:元素名 --> <xsl:analyze-string select="." regex="Q\{([^}]+)\}([^/[]+)"> <xsl:matching-substring> <xsl:variable name="ns-uri" select="regex-group(1)"/> <xsl:variable name="prefix" select="key('ns-prefix-map', $ns-uri)"/> <xsl:choose> <xsl:when test="$prefix"> <xsl:value-of select="concat($prefix, ':', regex-group(2))"/> </xsl:when> <xsl:otherwise> <!-- 找不到对应前缀时保留原内容 --> <xsl:value-of select="."/> </xsl:otherwise> </xsl:choose> </xsl:matching-substring> <xsl:non-matching-substring> <xsl:value-of select="."/> </xsl:non-matching-substring> </xsl:analyze-string> </xsl:attribute> </xsl:template> </xsl:transform>
使用方法
- 将上述XSLT保存为
convert-location.xsl文件 - 使用SaxonCS执行转换,命令示例:
dotnet SaxonCS.dll -s:your-svrl-report.xml -xsl:convert-location.xsl -o:formatted-svrl-report.xml
原理说明
- 通过
xsl:key将svrl:ns-prefix-in-attribute-values中的URI和前缀关联起来,实现快速查找 - 用
xsl:analyze-string配合正则表达式匹配location属性中的Q{URI}片段,替换为对应的前缀格式 - 保留无法匹配的片段,避免破坏路径结构
内容的提问来源于stack exchange,提问作者Cemal Çelik
相关产品推荐
相关产品推荐

