2014-11-07 2 views
1

Я объединять два файла, файл WADL и XML-файл, содержащий фрагменты DITA, чтобы в конечном итоге сгенерировать файл DITA. фрагменты DITA могут быть строкой текста или блоком тегов DITA. пытаясь определить, если элемент в файле фрагментов DITA заполняется (или даже не существует) со следующим испытанием:XSLT тест для текста или всего

<xsl:variable name="docIDtext" select="$docId//doc[@id=$resourcepath]/*|text()"/> 
<xsl:choose> 
    <xsl:when test="$docIDtext"> 
     <xsl:copy-of select="$docIDtext"/> 
    </xsl:when> 
    <xsl:otherwise> 
     <draft-comment author="doc">FIXME: missing DocID</draft-comment> 
    </xsl:otherwise> 
</xsl:choose> 

однако, тест на $docIDtext всегда верно, что не является правильным результатом. это то, что надоедает «*». Как я могу выполнить этот тест?

ответ

1

Это немного трудно сказать, без входных документов и ожидаемого результата, но я предполагаю, что исправление написать:

<xsl:variable name="docIDtext" select=" 
    $docId//doc[@id=$resourcepath]/* | 
    $docId//doc[@id=$resourcepath]/text() 
"/> 

Выражение вида a/b|c оценивается как (a/b) | c, не a/(b|c), последний в любом случае, недействителен в XPath 1.0.

Указанная выше инструкция xsl:variable может быть оптимизирована с использованием временного значения для элемента doc. Но лучшее решение было бы использовать тест node() узла, который будет соответствовать любому типу дочернего узла:

<xsl:variable name="docIDtext" select="$docId//doc[@id=$resourcepath]/node()"/> 

Это будет возвращать как дочерние элементы и текстовые узлы (а также комментарии и инструкция по обработке).

+0

, к сожалению, пропустил вопрос. оператор '' работает так, как и переменная, указанная в моем вопросе. проблема в том, что я хочу проверить переменную, чтобы увидеть, есть ли у нее контент, но тест для 'docIDtext' всегда возвращает true. – masterbrawn

+0

Отвечая на ваш ответ, я понял, что мне не хватает простого решения: просто проверьте наличие '$ docId // doc [@ id = $ resourcepath]'. таким образом мне не нужно заботиться о том, что такое содержимое тега, или даже если оно имеет содержимое, только если оно существует. для моего конкретного использования, этого достаточно. спасибо за ответ и триггер. – masterbrawn

+0

Это зависит от контекста вашего XSLT-фрагмента, но и ваша команда 'copy-of', безусловно, работает не так, как вы ожидаете для текстовых узлов элемента' doc' по причине, приведенной в моем ответе. – nwellnhof

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