Я пытался выяснить способ использования параметра/переменной в качестве аргумента функции. По крайней мере, я хотел бы быть в состоянии использовать основные параметры строки в качестве аргументов следующим образом:Использование аргумента xsl в качестве аргумента функции XPath
<xsl:param name="stringValue" default="'abcdef'"/>
<xsl:value-of select="substring(string($stringValue),1,3)"/>
Приведенный выше код не генерирует никакого вывода.
Я чувствую, что мне не хватает простого способа сделать это. Я рад использовать exslt или другое расширение, если процессор xslt 1.0 этого не позволяет.
Edit:
Я использую XSL 1.0 и преобразование с использованием Nokogiri, который поддерживает XPATH 1.0. Вот более полный фрагмент того, что я пытаюсь сделать:
Я хочу передать номера столбцов в качестве параметров, используя nokogiri следующим
document = Nokogiri::XML(File.read('table.xml'))
template = Nokogiri::XSLT(File.read('extractTableData.xsl'))
transformed_document = template.transform(document,
["tableName","'Problems'", #Table Heading
"tablePath","'Table'", #Takes an absolute XPATH String
"nameColumnIndex","2", #column number
"valueColumnIndex","3"]) #column number
File.open('FormattedOutput.xml', 'w').write(transformed_document)
Мой XSL то хочет получить доступ ко всем TD [valueColumnIndex] и и получить первые 3 символа в этой позиции, поэтому я использую подстроку. Так что я хочу сделать что-то вроде:
<xsl:value-of select="substring(string(TD[$valueColumnIndex]),1,3)"/>
Так как я был не в состоянии сделать это, я попытался извлечь TD [$ valueColumnIndex] другие пары valueCode
, а затем сделать substring(string(valueCode),1,3)
Это не сработало (то есть текст не выводился, тогда как <xsl:value-of select="$valueCode"/>
дал мне ожидаемый результат).
В результате я решил понять, как лучше использовать параметры, я бы просто использовал строчную кодированную строку, как упоминалось в моем предыдущем вопросе.
вещей я попытался:
используя одиночные кавычки вокруг ABCDEF (и не очень), а используя строку() вокруг имени пар (и не очень)
Основываясь на комментарии ниже, кажется, я инвалид в моей способности понять ошибку, потому что Nokogiri не сообщает об ошибке для этих ситуаций. Я сейчас устанавливаю xsltproc и вижу, получаю ли я какие-либо ошибки.
Наконец, вот мой весь xsl. Я использую отдельный шаблон forLoop
из-за valueCode
param, который я создаю. Линии интереса - последние 5 или около того. Я не могу включить xml, поскольку есть проблемы с использованием данных.
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="http://exslt.org/common"
xmlns:dyn="http://exslt.org/dynamic"
exclude-result-prefixes="ext dyn">
<xsl:param name="tableName" />
<xsl:param name="tablePath" />
<xsl:param name= "nameColumnIndex" />
<xsl:param name= "valueColumnIndex"/>
<xsl:template match="/">
<xsl:param name="tableRowPath">
<xsl:value-of select="$tablePath"/><xsl:text>/TR</xsl:text>
</xsl:param>
<!-- Problems -->
<section>
<name>
<xsl:value-of select="$tableName" />
</name>
<!-- <xsl:for-each select="concat($tablePath,'/TR')"> -->
<xsl:for-each select="dyn:evaluate($tableRowPath)">
<!-- Encode record section -->
<xsl:call-template name="forLoop"/>
</xsl:for-each>
</section>
</xsl:template>
<xsl:template name="forLoop">
<xsl:param name="valueCode">
<xsl:value-of select="./TD[number($valueColumnIndex)][text()]"/>
</xsl:param>
<xsl:param name="RandomString" select="'Try123'"/>
<section>
<name>
<xsl:value-of select="./TD[number($nameColumnIndex)]"/>
</name>
<code>
<short>
<xsl:value-of select="substring(string($valueCode),1,3)"/>
</short>
<long>
<xsl:value-of select="$valueCode"/>
</long>
</code>
</section>
</xsl:template>
</xsl:stylesheet>
Это делает, но, видимо, вы не можете видеть это. Результат аналогичен (в зависимости от вашего конкретного процессора): 'Fatal Error: Attribute @default не разрешен для элемента' 'Неустранимая ошибка: синтаксическая ошибка XPath в ...: строка функции() должна иметь не более 1 аргумента '. –
Это XSLT 1.0 или 2.0?Каков контекст вышеуказанного кода: внутри внутри xsl: template или xsl: function, или что? –
Мне очень жаль, что мне так долго приходилось отвечать - я добавил редактирование с дополнительной информацией. Я использую xslt 1.0, и в моем первоначальном коде отсутствовали близкие parens по первому аргументу для подстроки. – achan