После стольких чтений я все еще чувствую себя новым для xsl. У меня есть файл xsl, к которому я добавляю шаблон (который я получил с веб-страницы, которая, кажется, работает) - пока я не укажу выходную строку с пространством имен. Таким образом, мой xsl-файл выглядит следующим образом (для краткости материал в середине исключен:
<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:max="http://www.ibm.com/maximo" exclude-result-prefixes="max">
<xsl:output method="xml" encoding="utf-8" indent="yes"/>
<xsl:variable name="pChunkSize" select="150" />
<xsl:template match="/">
<xsl:apply-templates select="max:InvokeFMSPO"/>
</xsl:template>
<xsl:template match="max:InvokeFMSPO">
<xsl:text>
</xsl:text>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:fms="http://www.MitchellHumphrey.com/FMSServices">
<soapenv:Header/>
<soapenv:Body>
<fms:CreatePOBatch>
:
:
:
</fms:LineItems>
<fms:ExtendedDesc>
<fms:POBatchExtendedDesc>
<xsl:apply-templates select="max:DESCRIPTION_LONGDESCRIPTION"/>
</fms:POBatchExtendedDesc>
</fms:ExtendedDesc>
</fms:POBatchDocument>
</xsl:for-each>
</fms:Documents>
</fms:BatchInput>
</fms:CreatePOBatch>
</soapenv:Body>
</soapenv:Envelope>
</xsl:template>
<xsl:template match="/max:InvokeFMSPO/max:FMSPOSet/max:PO/max:DESCRIPTION_LONGDESCRIPTION/text()" name="chunk">
<xsl:param name="pText" select="."/>
<xsl:if test="string-length($pText) >0">
<Type>HT</Type>
<fms:Text>
<xsl:value-of select=
"substring($pText, 1, $pChunkSize)"/>
</fms:Text>
<xsl:call-template name="chunk">
<xsl:with-param name="pText"
select="substring($pText, $pChunkSize+1)"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Теперь в конце шаблона (с именем chunk) я хочу вывести некоторые литеральные элементы, которые будут включены в вывод, поэтому я попробовал это:
<fms:Text>
<xsl:value-of select=
"substring($pText, 1, $pChunkSize)"/>
</fms:Text>
, но я получаю ошибку: "Для элемента префикс пространства имен 'fms' не объявлен."
, если я возьму из него "fms:" компилируется и запускается (но вывод неправильный, так как в выводе отсутствует «fms:»):
<Text>
<xsl:value-of select=
"substring($pText, 1, $pChunkSize)"/>
</Text>
В разделе выше последнего объявления шаблона «fms:» не проблема - почему это проблема в последнем шаблоне, и как я могу получить «fms:» в моих выходных данных?
, кроме того, как предполагается, чтобы разделить длинный текстовый элемент на входе для набора максимального элемента длиной 150 значения снова и снова, пока вся исходная строка не будет представлена в выводе, как это:
<fms:ExtendedDesc>
<fms:POBatchExtendedDesc>
<fms:Type>HT</Type>
<fms:Text>150 chars max</Text>
<fms:Type>HT</Type>
<fms:Text>150 chars max</Text>
<fms:Type>HT</Type>
<fms:Text>the last few characters <= 150</Text>
</fms:POBatchExtendedDesc>
</fms:ExtendedDesc>