使用 XSLT1.0 替换字符串

Replacing a string using XSLT1.0

我有以下传入的 XML 输入。

    <Cert>
    <x509Cert>-----BEGIN CERTIFICATE----- MIIE7jCCA9agAwIBAgIQSxwJEMml4T/r5K/vfYKaJjANBgkqhkiG9w0BAQsFADB+ MQswCQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xHzAd BgNVBAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsxLzAtBgNVBAMTJlN5bWFudGVj IENsYXNzIDMgU2VjdXJlIFNlcnZlciBDQSAtIEc0MB4XDTE1MDExMjAwMDAwMFoX DTE2MDExMzIzNTk1OVoweDELMAkGA1UEBhMCVVMxDTALBgNVBAgMBE9oaW8xETAP BgNVBAcMCENvbHVtYnVzMRcwFQYDVQQKDA5KUE1vcmdhbiBDaGFzZTEQMA4GA1UE CwwHR1RJIEdOUzEcMBoGA1UEAwwTZ25ld2ViLmpwbWNoYXNlLm5ldDCCASIwDQYJ KoZIhvcNAQEBBQADggEPADCCAQoCggEBAOh5cImc6o4dXMfRtlFGZxt16FajFDi1 gZ6A4eYnuU+PUa1gxC6RF4B8ENQdW66RNVHhgatOuGQ4DuphvREnHy32NTQCNGiy xYeUwAIsLDFPY0vc0I9c/x6MoIVqJKdesnfiA41R2t41w9viS2WtXhVc9cCYOwX7 pmGYVEelUxnUUd/HUZvY5AuCUAJFzQO66BbRYjRZvJDAvE2G+xJwFaB5IJo3dU/j j ZW0H9BeIQfRDlpxb4WL0cUS70FN1RyVDPZSwnyHej+BxEN3pjZXUryBjZ8R+Z5TE zbFusEBtC8qTuT+37wUOoMLB -----END CERTIFICATE-----</x509Cert>
    </Cert>

我需要从字符串中删除“-----BEGIN CERTIFICATE-----”和“-----END CERTIFICATE-----”(忽略大小写)。尾随和前面的“---------”的数量可以变化。

预期输出为:

    <Cert>
    <x509Cert>MIIE7jCCA9agAwIBAgIQSxwJEMml4T/r5K/vfYKaJjANBgkqhkiG9w0BAQsFADB+ MQswCQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xHzAd BgNVBAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsxLzAtBgNVBAMTJlN5bWFudGVj IENsYXNzIDMgU2VjdXJlIFNlcnZlciBDQSAtIEc0MB4XDTE1MDExMjAwMDAwMFoX DTE2MDExMzIzNTk1OVoweDELMAkGA1UEBhMCVVMxDTALBgNVBAgMBE9oaW8xETAP BgNVBAcMCENvbHVtYnVzMRcwFQYDVQQKDA5KUE1vcmdhbiBDaGFzZTEQMA4GA1UE CwwHR1RJIEdOUzEcMBoGA1UEAwwTZ25ld2ViLmpwbWNoYXNlLm5ldDCCASIwDQYJ KoZIhvcNAQEBBQADggEPADCCAQoCggEBAOh5cImc6o4dXMfRtlFGZxt16FajFDi1 gZ6A4eYnuU+PUa1gxC6RF4B8ENQdW66RNVHhgatOuGQ4DuphvREnHy32NTQCNGiy xYeUwAIsLDFPY0vc0I9c/x6MoIVqJKdesnfiA41R2t41w9viS2WtXhVc9cCYOwX7 pmGYVEelUxnUUd/HUZvY5AuCUAJFzQO66BbRYjRZvJDAvE2G+xJwFaB5IJo3dU/j j ZW0H9BeIQfRDlpxb4WL0cUS70FN1RyVDPZSwnyHej+BxEN3pjZXUryBjZ8R+Z5TE zbFusEBtC8qTuT+37wUOoMLB</x509Cert>
    </Cert>

请告知最好的方法。

我相信这对你有用:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="x509Cert">
    <xsl:copy>
        <xsl:value-of select="normalize-space(substring-after(substring-before(translate(., '-', ''), 'END CERTIFICATE'), 'BEGIN CERTIFICATE'))" />
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

虽然我不确定“忽略大小写”到底是什么意思。


编辑:

我已经设法找到 specification for this type of document (a PEM file). You will see in Section 2 指定页眉和页脚 非常 准确 - 精确到 [=12] 周围连字符和空格的数量=] 和 END CERTIFICATE 标签。

这意味着对于符合规范的 PEM 文件,代码可以大大简化为:

<xsl:template match="x509Cert">
    <xsl:copy>
        <xsl:value-of select="substring(., 29, string-length(.) - 54)" />
    </xsl:copy>
</xsl:template>