Замена строки с помощью 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>

Посоветуйте, как лучше это сделать.


person Sekhar    schedule 04.05.2016    source источник
comment
Привет Сехар, Добро пожаловать в S.O. Не могли бы вы предоставить дополнительную информацию, например, что вы пробовали до сих пор и какой язык вы используете.   -  person Erresen    schedule 05.05.2016


Ответы (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). Вы увидите в Раздел 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>
person michael.hor257k    schedule 04.05.2016
comment
Спасибо, Майкл. Это работает. Пожалуйста, помогите мне понять, как правильно искать новую строку (\n), разрыв строки, возврат каретки и пробел в строке с помощью XSLT. - person Sekhar; 05.05.2016
comment
Я не эксперт в этом, но попробуйте: stackoverflow.com/search?q=[xslt] +%22новая+строка%22 - person michael.hor257k; 05.05.2016
comment
Спасибо. Я взгляну. Что касается вашего вопроса об игнорировании регистра, я имею в виду, что поиск BEGIN CERTIFICATE должен быть нечувствительным к регистру. Является ли translate() единственным способом добиться этого в XSLT1.0? - person Sekhar; 05.05.2016
comment
Да это так. Вы уверены, что вам это нужно? Это сложнее, чем простой перевод, потому что вам нужно сохранить исходный регистр полезной нагрузки. - person michael.hor257k; 05.05.2016
comment
Я думаю, вы правы. В случае X.509 BEGIN CERTIFICATE и END CERTIFICATE всегда в верхнем регистре, и я думаю, что это относится ко всем сертификатам X509. Итак, предоставленное вами решение будет работать со всеми сертификатами. Пожалуйста, дайте мне знать, если вы думаете иначе. - person Sekhar; 05.05.2016
comment
Привет, Майкл, это полезно. Спасибо!! - person Sekhar; 06.05.2016