#xml #xslt #xpath
#xml #xslt #xpath
Вопрос:
У меня есть очень простое соответствие шаблону в моем коде xslt для создания ditamap, и оно работает, просто создавая topicref всякий раз, когда совпадает с «разделом» исходного документа.
Исходный фрагмент xml-кода выглядит следующим образом:
<Section Target="IL27TRM409TueAug251754042009251">
<Heading Target="v5170372">WBG (S-GW/P-GW) chassis </Heading>
Соответствие шаблона xslt для раздела выглядит следующим образом:
<xsl:template match="Section>
<xsl:variable name="file" select="Heading"/>
<xsl:variable name="fileName" select="translate(normalize-space($file),' ','_')"/>
<topicref format="dita" href="{translate(./$fileName,' ','_')}.xml" navtitle="{./Heading}">
<xsl:apply-templates/>
</topicref>
Код работает, за исключением того, что для заголовка, подобного приведенному выше «Шасси WBG (S-GW / P-GW)», он примет «/» в качестве вложенной папки, поэтому он создаст вложенный каталог с именем «WBG (S-GW», а затем создаст файл «P-GW)_chassis.xml «.
Есть ли способ заставить xslt игнорировать «/» в заголовке и просто обрабатывать его как строку для создания xml-файла, просто используя эту строку?
Комментарии:
1. XSLT не создает подкаталоги, он просто принимает любое количество XML-деревьев в качестве входных данных и выводит одно (или несколько в XSLT 2.0) XML-дерево в качестве выходных данных. Он может отвечать за сериализацию, а может и не отвечать. Здесь потребитель вашего вывода понимает, что ваш
@href
ссылается на вложенную папку. Почему бы вам просто не заменить/
символ на другой, допустимый в URI?
Ответ №1:
Роберт, просто чтобы расширить правильный ответ / комментарий @Alejandro:
Папку создает не XSLT. XSLT уже «игнорирует» /
в заголовке: он не рассматривает его как нечто особенное. (Посмотрите на вывод XSLT, и вы можете это увидеть.)
В какой операционной системе (или, точнее, файловой системе) вы создаете файлы? В зависимости от этого ‘/’ может быть недопустимым символом в именах файлов, поэтому замена его другим символом может быть вашим единственным вариантом. Попробуйте присвоить файлу имя a/b
вручную и посмотрите, возможно ли это вообще. Поскольку вы normalize-space()
уже используете, кажется, что вам не обязательно сохранять содержимое заголовка точно в имени файла.
Чтобы заменить -
на /
, измените ваше translate()
выражение следующим образом:
translate(normalize-space($file),' /','_-')
Это означает «заменять _
на каждый пробел и заменять -
на каждый /
«.