Убрать пробел в значении тега XML на основе условия длины с использованием XSLT - PullRequest
1 голос
/ 08 марта 2012

У меня очень простой запрос, но я не смог найти самый простой / элегантный способ его решения. Если в моем входном XML есть тег со строковым содержимым «YY nnn», где YY - это 2 буквенно-цифровых символа, затем пробел, а затем до 4 цифр. В моем выходном XML мне нужно убрать пробел, если цифры 4 символа - т.е. "YY nnnn" и оставьте пробел, если "YY nnn". Я попытался проверить длину строки, а затем убрать пробел, но я уверен, что должен быть более простой способ.

Есть идеи?

Я использую xlstproc в Linux для преобразований.

Спасибо!

1 Ответ

1 голос
/ 08 марта 2012

Пример ввода XML:

<?xml version="1.0" encoding="utf-8"?>
<root>
  <MyNode>AZ 1234</MyNode>
  <MyNode>A3 123</MyNode>
  <MyNode>7Z 12345</MyNode>
  <MyNode>15 23</MyNode>
</root>

XSLT-код:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="MyNode">
    <xsl:copy>
      <xsl:choose>
        <xsl:when test="string-length(substring-after(.,' '))='4'">
          <xsl:value-of select="concat(substring-before(.,' '), substring-after(.,' '))"/>
        </xsl:when>
        <xsl:when test="string-length(substring-after(.,' '))='3'">
          <xsl:value-of select="."/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="."/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

Вывод:

<?xml version="1.0" encoding="utf-8"?>
<root>
  <MyNode>AZ1234</MyNode>
  <MyNode>A3 123</MyNode>
  <MyNode>7Z 12345</MyNode>
  <MyNode>15 23</MyNode>
</root>
...