Как я могу кодировать содержимое шаблона в base64, используя XSLT 1.0?
Редактирование: использование режима сериализации, запуск в среде PHP
Как будто у меня есть такой шаблон:
<xsl:template name="test">
<test
gender="male"name1="TEST"name2="TEST">
<sometags>
<tag></tag>
</sometags>
</test>
</xsl:template>
и я хочу, чтобы вывод был таким:
<base64>PHRlc3QgDQoJCSAgZ2VuZGVyPSJtYWxlIiANCgkJICBuYW1lMT0iVEVTVCIgDQoJCSAgbmFtZTI9IlRFU1QiPg0KICAgICAgICAgIDxzb21ldGFncz4NCgkJCQk8dGFnPjwvdGFnPg0KCQkJPC9zb21ldGFncz4NCgkJPC90ZXN0Pg==</base64>
Мухул Ганди создал кодировщик Base64 который работает в XSLT 1.0. Если вы можете переключиться на XSLT 2.0, вы можете создать функции таблицы стилей, чтобы сделать то же самое.
Однако, поскольку вы, похоже, хотите закодировать узлы в строки, вы не должны создавать узлы, а вместо этого строки:
Повторно примените результат вашего шаблона, используя node-set
функция расширения (поддерживается (почти?) всеми процессорами XSLT 1.0) и напишите что-то вроде этого:
<xsl:template match="*">
<xsl:text><</xsl:text>
<xsl:value-of select="name()" />
<xsl:apply-templates select="@*" />
<xsl:text>></xsl:text>
<xsl:apply-templates />
<xsl:text></</xsl:text>
<xsl:value-of select="name()" />
<xsl:text>></xsl:text>
</xsl:template>
<xsl:template match="@*">
<xsl:text> </xsl:text>
<xsl:value-of select="name()" />
<xsl:text>="</xsl:text>
<xsl:value-of select="." />
<xsl:text>"</xsl:text>
</xsl:template>
Примечание: не проверено, и вы, вероятно, захотите расширить его, чтобы добавить отступы, обработку других узлов, таких как инструкции обработки и комментарии, а в случае атрибутов — экранировать любые кавычки в строках.
В XSLT 3.0 вы можете добиться того же, используя fn:serialize
функция.
Других решений пока нет …