Удалить специальные символы из XML через XSLT только для определенных тегов - PullRequest
2 голосов
/ 08 июля 2010

У меня проблема с определенными символами в моем XML.По сути, я делю xml на несколько xmls, используя Xalan Processor.

При разделении документов я использую их значение тега name в качестве имени создаваемого файла.Проблема состоит в том, что имя содержит символы, которые не распознаются процессором XML, такие как ™ (TM) и ® (R).Я хочу удалить эти символы ТОЛЬКО при именовании файлов.

<xsl:template match="products">
    <redirect:write select="concat('..\\xml\\product\\en\\',translate(string(name),'&lt;/&gt; ',''),'.xml')">

Выше приведен код XSL, который у меня есть, чтобы разделить XML на XML-файлы множественного типа.Как вы можете видеть, я использую метод hte translate для подстановки '/', '<', '>' с '' из имени.Я надеялся, что смогу сделать то же самое с ™ (TM) и ® (R), но, похоже, это не сработает.Пожалуйста, посоветуйте мне, как я смогу это сделать.

Спасибо за вашу помощь заранее.

Ответы [ 2 ]

3 голосов
/ 08 июля 2010

У меня нет Xalan, но с 8 другими процессорами XSLT это преобразование:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="text()">
   <xsl:value-of select="translate(., '&lt;/&gt;™®', '')"/>
   ===================
   <xsl:value-of select="translate(., '&lt;/&gt;&#x2122;&#xAE;', '')"/>
 </xsl:template>
</xsl:stylesheet>

при применении к этому документу XML:

<t>XXX™ My Trademark®</t>

дает желаемый результат:

XXX My Trademark
   ===================
   XXX My Trademark

Я предлагаю вам попробовать использовать одно из двух приведенных выше выражений - по крайней мере, второе может успешно работать.

2 голосов
/ 09 июля 2010

После ответа Димитра, я думаю, что если вы не уверены, какой специальный символ может быть в name, возможно, вам следует оставить то, что вы считаете именными символами легального документа.

Например:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>

 <xsl:template match="text()">
   <xsl:value-of select="translate(.,
                                   translate(.,
                                             'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ ',
                                             ''),
                                   '')"/>
 </xsl:template>
</xsl:stylesheet> 

С вводом:

<t>XXX™ My > Trademark®</t>

Результат:

XXX My  Trademark
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...