genkgo/xsl

此包的最新版本(1.4.0)没有可用的许可证信息。

PHP中的XSL 2.0转换器

1.4.0 2024-08-22 14:40 UTC

README

PHP中的XSL 2.0转换器。

安装

需要支持的PHP版本。可以通过Composer以 genkgo/xsl 的形式安装和自动加载。

质量

workflow code check

在命令行中运行单元测试,请输入 ./vendor/bin/phpunit -c phpunit.xml。此库试图遵守 PSR-1PSR-2PSR-4。如果您注意到遵守疏忽,请通过拉取请求发送补丁。

入门指南

XSLTProcessor 替换为 Genkgo\Xsl\XsltProcessor,将 version="1.0" 中的 version="2.0" 进行更改,您就完成了!

<?php
use Genkgo\Xsl\XsltProcessor;
use Genkgo\Xsl\Cache\NullCache;

$xslDoc = new DOMDocument();
$xslDoc->load('Stubs/collection.xsl');

$xmlDoc = new DOMDocument();
$xmlDoc->load('Stubs/collection.xml');

$transpiler = new XsltProcessor(new NullCache());
$transpiler->importStylesheet($xslDoc);
echo $transpiler->transformToXML($xmlDoc);

创建自己的扩展

您还可以注册自己的扩展。只需实现 XmlNamespaceInterface,您就可以使用自己的元素转换和xpath函数了。请参阅下面的示例和 集成测试 来了解其工作原理。

<?php
// use omitted for readability

class MyExtension implements XmlNamespaceInterface {

    const URI = 'https://github.com/genkgo/xsl/tree/master/tests/Stubs/Extension/MyExtension';

    public function register(TransformerCollection $transformers, FunctionCollection $functions) {
        $functions->set(
            self::URI, 
            new class extends AbstractLazyFunctionMap {
                public function newFunctionList(): array
                {
                    return [
                        'hello-world' => ['newStringFunction', MyExtension::class],
                    ];
                }
            }
        );
    }

    public static function helloWorld(Arguments $arguments) {
        return 'Hello World was called and received ' . count($arguments->unpack()) . ' arguments!';
    }

}

$factory = new ProcessorFactory(new NullCache(), [new MyExtension()]);
$processor = $factory->newProcessor();

然后在您的样式表中调用该函数。

<xsl:stylesheet version="2.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:my="https://github.com/genkgo/xsl/tree/master/tests/Stubs/Extension/MyExtension">

    <xsl:output omit-xml-declaration="yes" />

    <xsl:template match="/">
        <xsl:value-of select="my:hello-world(1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)" />
    </xsl:template>

</xsl:stylesheet>

将产生: Hello World 被调用并接收了 20 个参数!

缓存:转换一次

根据您的样式表的复杂性,转换过程可能会减慢文档的处理速度。因此,您可能希望缓存结果样式表。通过在 composer.json 中添加 psr/simple-cache,您将添加启用缓存的可能性。请参阅下面的示例,或查看 集成测试 来了解其工作原理。

<?php
use Genkgo\Xsl\Cache\ArrayCache;
use Genkgo\Xsl\ProcessorFactory;

$factory = new ProcessorFactory(new ArrayCache());
$processor = $factory->newProcessor();

贡献

  • 发现了一个错误?请先尝试自己解决,然后提交一个拉取请求。如果您无法修复它,至少给出一个清晰的错误描述。我们将在有时间时查看。
  • 想要添加功能吗?提交一个拉取请求,看看会发生什么。您也可以提交缺少功能的错误报告,我们可以讨论如何实现它。