я хочу сослаться на внешний xml в xls в элементе
<xsl:element name=
"{document('mapping.xml', /)/mappings/column/[@id=name()]}" >
Да, атрибут name
инструкции <xsl:element>
допускает AVT (Шаблон атрибута-значения s )
У предоставленного кода есть ряд проблем :
Существует очевидноесинтаксическая ошибка в предоставленном вами коде:
document('mapping.xml', /)/mappings/column/[@id=name()]
не является синтаксически допустимым выражением XPath.На последнем шаге определения местоположения отсутствует проверка узла, а есть только предикат.
.2. В приведенном выше выражении нет ничего, что относится к текущему узлу в исходном XML-документе .Я предполагаю, что предикат
[@id=name()]
должен быть примерно таким:
[@id=name(current())]
Итак, я предполагаю, чтовы можете захотеть что-то вроде :
<xsl:element name=
"{document('mapping.xml', /)/mappings/column[@id=name(current())]}" >
Может быть дополнительная, третья проблема: (подтверждено в комментарии ОП как реальная проблема):
Выражение, указанное как AVT в атрибуте name
выше, может иметь строковое значение, которое не является синтаксически допустимым QName.Примеры недопустимых значений sych: 123
или A B
В этом случае возможны различные решения :
- Использовать строковое значение другого узла(измените выражение XPath).
- Преобразуйте нарушающие символы в допустимый символ:
...
concat(
translate(substring(yourExpression,1,1),
$illegalFirstCharacters,
'________________'),
translate(substring(yourExpression,2),
$illegalCharacters,
'________________')
)
, где $illegalFirstCharacters
- переменнаяопределяется как содержащий все возможные символы, которые могут встречаться в качестве первого символа и которые не допускаются в качестве первого символа QName *. 1069 *
и $illegalCharacters
- это переменная, определенная, чтобы содержать все возможные символы, которые могут появляться послепервый символ и не допускается, как в QName после его первого символа.
По существу, $illegalFirstCharacters
- это конкатенация $illegalCharacters
и строки "0123456789"
.
Последний аргументtranslate()
выше должно быть достаточно длинным, чтобы вместить по одному _
для каждого возможного недопустимого символа.
Это преобразование в действительное QName может быть выражено намного проще в XPath 2.0 (XSLT 2.0) использование регулярных выражений.
Это решение, конечно, следует применять с осторожностью, поскольку в зависимости от фактических данных возможно преобразование двух разных значений, содержащих недопустимые символы QNAme, втот же QName.