【问题标题】:Replacing a string using XSLT1.0使用 XSLT1.0 替换字符串
【发布时间】:2016-05-04 20:55:00
【问题描述】:

我有以下传入的 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>

请建议最好的方法。

【问题讨论】:

  • 嗨 Sekhar,欢迎来到 S.O.您能否提供更多信息,例如您目前尝试过的内容以及您使用的语言。

标签: xslt xslt-1.0 pem


【解决方案1】:

我相信这应该适合你:

<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>

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


编辑:

我已设法找到此类文档(PEM 文件)的specification。您将在Section 2 中看到,页眉和页脚被精确地指定非常 - 精确到围绕BEGIN CERTIFICATE 和END CERTIFICATE 标签的连字符和空格的数量。

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

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

【讨论】:

  • 谢谢迈克尔。这行得通。请帮我弄清楚使用 XSLT 在字符串中搜索“换行(\n)”、换行、回车和空格的正确方法是什么。
  • 我不是这方面的专家,但请尝试:stackoverflow.com/search?q=[xslt]+%22new+line%22
  • 谢谢。我会看一看。关于您关于“忽略大小写”的问题,我的意思是搜索“BEGIN CERTIFICATE”应该不区分大小写。 translate() 是在 XSLT1.0 中实现这一目标的唯一方法吗?
  • 是的。你确定你需要这个吗?它比简单的翻译更复杂,因为您需要保留有效载荷的原始大小写。
  • 我认为你是对的。在 X.509 的情况下,“BEGIN CERTIFICATE”和“END CERTIFICATE”总是大写,我认为所有 X509 证书都是这种情况。因此,您提供的解决方案将适用于所有证书。如果您有其他想法,请告诉我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-14
  • 2013-02-05
  • 2021-03-01
  • 2011-08-10
相关资源
最近更新 更多