Мы получаем XML-пакет с изменением цены, а затем хотим обновить конкретный раздел HTML-документа. Проблема в том, что единственный способ увидеть, как это работает, — это двухэтапное преобразование, которое сначала преобразует пакет XML в правильно сформированный фрагмент HTML, а затем второй XSLT для чтения в файле HTML и перезаписывания этого конкретного раздела.
HTML-файл для обновления (он правильно сформирован):
<html>
<head>
<title>Mini-me Amazon</title>
</head>
<body>
<p>This is our Product Price Sheet</p>
<table style="width:100%">
<tr>
<th>Product</th>
<th>Price</th>
</tr>
<tr data-key="1">
<td>Whiz-bang widget</td>
<td name="price1">$19.99</td>
</tr>
<tr data-key="3">
<td>Unreal widget</td>
<td name="price3">$99.99</td>
</tr>
...
</table>
</body>
</html>
Входящий XML:
<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" href="xml-price.xsl"?>
<supplier>
<product>
<key>3</key>
<pprice uptype="1">
<price>$22.34</price>
</pprice>
</product>
</supplier>
1-й XSL:
<xsl:stylesheet ...>
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/supplier">
<xsl:apply-templates select="product"/>
</xsl:template>
<xsl:template match="product">
<xsl:variable name="PKey">
<xsl:value-of select="key"/>
</xsl:variable>
<xsl:for-each select="pprice"> <!-- could be more than 1 -->
<xsl:choose>
<xsl:when test="@uptype=0">
</xsl:when>
<xsl:when test="@uptype=1">
<xsl:apply-templates select="price"/>
</xsl:when>
<xsl:otherwise>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:template>
<xsl:template match="price">
<td name="rate$PKey"><xsl:value-of select="."/></td>
</xsl:template>
</xsl:stylesheet>
Итак, Saxon-js возвращает <td name="price3">$22.34</td>
. Все хорошо. Итак, мы хотим взять этот фрагмент HTML и обновить HTML.
2-й XSL:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="td[@name='price3']"> <!-- Problem 1 -->
<td name="price3">$22.34</td> <!-- Problem 2 -->
</xsl:template>
<xsl:template match="/">
<xsl:apply-templates select="document('/home/tireduser/node/bigstuff/public/update-html.html')/node()"/>
</xsl:template>
</xsl:stylesheet>
Проблема:
Как получить динамические значения price3
и <td name="price3">$22.34</td>
(которые изменяют каждый новый поступающий XML) во второй XSL без повторной компиляции XSL в .sef.json, который требует Saxon-js, и без использования параметров для передачи этих значения (так как мы прочитали, что использовать параметры не рекомендуется? Или все это можно сделать за 1 преобразование?
2-й вопрос: состояние документов Saxon-js:
Using fn:transform()
If a source XSLT stylesheet is supplied as input to the fn:transform() function in XPath, the XX compiler will be invoked to compile the stylesheet before it is executed. However, there is no way of capturing the intermediate SEF stylesheet for subsequent re-use.
Мы обнаружили, что это неправда (или мы делаем это неправильно). Если мы просто передаем XSL в функцию Transform (stylesheetFileName:), возникает ошибка.