вопрос подстроки xslt - PullRequest
       0

вопрос подстроки xslt

0 голосов
/ 20 января 2011

Я новичок в XSLT. У меня есть входной XML-файл, который должен быть показан как другой выходной XML. Я использую xslt для преобразования. Входной XML:

<Row>
<Column>abc.xyz.ijm</Column>
<Row>

Выходной XML:

<abc>
  <xyz>
    <ijm>String</ijm>
  </xyz>
</abc>

Я пытался использовать xsl: когда вместе с функциями substring-before и substring-after, но результат xml не близко к тому, что я хочу. Как узнать последний случай «.» так что создается <ijm>String</ijm>, за которым следуют конечные теги слов, которые находятся перед каждым из предыдущих вхождений '.' так что </xyz> and </abc> может быть добавлено, как показано в выводе xml выше?

Любой фрагмент кода совсем не приветствуется.

Заранее спасибо.

1 Ответ

0 голосов
/ 20 января 2011

Это преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="Column/text()" name="tokenize">
   <xsl:param name="pText" select="."/>
   <xsl:if test="string-length()">
    <xsl:choose>
      <xsl:when test="not(contains($pText,'.'))">
        <xsl:element name="{$pText}">String</xsl:element>
      </xsl:when>
      <xsl:otherwise>
        <xsl:element name="{substring-before($pText,'.')}">
          <xsl:call-template name="tokenize">
            <xsl:with-param name="pText"
              select="substring-after($pText,'.')"/>
          </xsl:call-template>
        </xsl:element>
      </xsl:otherwise>
    </xsl:choose>
   </xsl:if>
 </xsl:template>
</xsl:stylesheet>

при применении к предоставленному документу XML (исправлено, чтобы быть правильно сформированным):

<Row>
    <Column>abc.xyz.ijm</Column>
</Row>

дает желаемый, правильный результат :

<abc>
   <xyz>
      <ijm>String</ijm>
   </xyz>
</abc>

Объяснение

  1. Рекурсивно вызванный именованный шаблон с условием остановки: параметр $pText является либо пустой строкой, либо строкой, не содержащей символ точки.

  2. Промежуточное действие : Создать элемент, имя которого является подстрокой перед символом '.' символ, затем рекурсивно вызовите себя с текстом после первого символа точки в качестве параметра.

  3. Остановить действие : Создать элемент с именем - всей строкой в ​​параметре и значением: строка "String".

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