2014-11-18 2 views
0

Я пытался выяснить способ использования параметра/переменной в качестве аргумента функции. По крайней мере, я хотел бы быть в состоянии использовать основные параметры строки в качестве аргументов следующим образом:Использование аргумента 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>

+1

Это делает, но, видимо, вы не можете видеть это. Результат аналогичен (в зависимости от вашего конкретного процессора): 'Fatal Error: Attribute @default не разрешен для элемента ' 'Неустранимая ошибка: синтаксическая ошибка XPath в ...: строка функции() должна иметь не более 1 аргумента '. –

+0

Это XSLT 1.0 или 2.0?Каков контекст вышеуказанного кода: внутри внутри xsl: template или xsl: function, или что? –

+0

Мне очень жаль, что мне так долго приходилось отвечать - я добавил редактирование с дополнительной информацией. Я использую xslt 1.0, и в моем первоначальном коде отсутствовали близкие parens по первому аргументу для подстроки. – achan

ответ

0

Используйте это следующим образом: "* Приведенный выше код не генерирует никакого вывода *"

<xsl:param name="stringValue" select="'abcdef'"/> 
<xsl:value-of select="substring($stringValue,1,3)"/> 
+0

Это хорошо работает с xsltproc. Я думаю, что я могу столкнуться с некоторыми проблемами с моим процессором – achan

 Смежные вопросы

  • Нет связанных вопросов^_^