Для этого может использоваться XSL (T) (или, может быть, нет, в зависимости от конфигурации сервера).
Текущая версия libxslt по-прежнему равна xsl 1.0 и не поддерживает xsl:result-document
.
Но он поддерживает расширение exsl:document
, которое служит практически для той же цели.
<?php
$xsl = new XSLTProcessor;
$xsl->setSecurityPrefs(
$xsl->getSecurityPrefs()^XSL_SECPREF_WRITE_FILE
);
$xsl->importStylesheet(doc(style()));
$doc = doc(data());
$xsl->transformToXML($doc);
function doc($xml) {
$doc = new DOMDocument;
$doc->loadxml($xml);
return $doc;
}
function style() {
return <<< eox
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl">
<xsl:template match="/">
<xsl:for-each select="Products/Product">
<exsl:document href="Product{ID}.xml" method="html">
<Product>
<xsl:apply-templates />
</Product>
</exsl:document>
</xsl:for-each>
</xsl:template>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
eox;
}
function data() {
return <<< eox
<Products>
<Product>
<ID>ID1</ID>
<Name>Product_Name1</Name>
<Qty>qty1</Qty>
<Brand>Brand1</Brand>
</Product>
<Product>
<ID>ID2</ID>
<Name>Product_Name2</Name>
<Qty>qty2</Qty>
<Brand>Brand2</Brand>
</Product>
<Product>
<ID>ID3</ID>
<Name>Product_Name3</Name>
<Qty>qty3</Qty>
<Brand>Brand3</Brand>
</Product>
<Product>
<ID>ID4</ID>
<Name>Product_Name4</Name>
<Qty>qty4</Qty>
<Brand>Brand4</Brand>
</Product>
</Products>
eox;
}
создает на моей машине четыре файла (ProductID1.xml ... ProductID4.xml), каждая из которых содержит данные одного элемента продукта.
XsltProcessor::setSecurityPrefs относительно новый. Ваш скрипт должен проверить, имеет ли экземпляр xsl такой метод, и вместо этого вместо него следует использовать ini_set('xsl.security_prefs'...)
, чтобы отключить «защиту записи». В противном случае вместо вывода вы можете получить пучок
Warning: XSLTProcessor::transformToXml(): File write for ProductID1.xml refused in ...test.php on line ...
предупреждение/ошибки.
И, возможно, вместо <Product><xsl:apply-templates />
конструкция <xsl:copy-of select="."/>
подходит больше.
Вы считаете приемлемым ответ на основе Java? –