You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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>

使用方法

  1. 将上述XSLT保存为convert-location.xsl文件
  2. 使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 21:44:55