Способ избежать создания подкаталога в topicref

#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),' /','_-')
  

Это означает «заменять _ на каждый пробел и заменять - на каждый / «.