xslt to (i) проверить, существует ли тег и не является ли он пустым (ii) извлечь родительский узел, если один из «значений» повторяющегося дочернего узла содержит строку в позиции - PullRequest
0 голосов
/ 13 января 2012

У меня проблема с реализацией следующих функций:

(i) Мне нужно проверить тег в xml.Если он существует и не является пустым, я должен получить его значение, иначе значение по умолчанию.Я пишу xslt, как показано ниже:

<xsl:if test="relation">
  <xsl:choose>
    <xsl:when test="boolean(relation/termId) and string(relation/termId) != ''">
      <xsl:value-of select="relation/termId" />
    </xsl:when>
    <xsl:otherwise>
      <xsl:text>DefaultTermId</xsl:text>
    </xsl:otherwise>
  </xsl:choose>
</xsl:if>

Итак, отношение / termId существует и имеет некоторое значение (скажем, <termId>x</termId>, я должен получить x). Xpath и все в порядке.Он отлично работает, когда тег termId не существует (=> Я получаю DefaultTermId), но возвращает пустой пробел, когда тег не имеет значения.Я имею в виду, когда is <termId></termId>, вместо «DefaultTermId» я получаю пустое место.я тоже попробовал relation/termId/text() != '', но безрезультатно.

(ii) Другая проблема => Мой xml выглядит следующим образом:

<GetSavedReportResponse xmlns="">
  <ResponseType>Success</ResponseType>
  <FileModifiedDateTime>2012-01-03T17:05:04</FileModifiedDateTime>
  <FileSizeBytes>7816</FileSizeBytes>
  <FileDataFormat>XML</FileDataFormat>
  <FileData>
    <Zthes>
      <term>
        <termId>49555</termId>
        <termUpdate>add</termUpdate>
        <termName>Active Personnel</termName>
        <termVocabulary>People Status Global</termVocabulary>
        <termVocabulary>Employee Status Global</termVocabulary>
        <termCategory>PDA</termCategory>
        <termCategory>PDI</termCategory>
        <termCategory>GLB</termCategory>
        <relation weight="100">
          <termId>49556</termId>
          <relationType>EQ</relationType>
          <termName>term name</termName>
          <termVocabulary>term vocabulary</termVocabulary>
        </relation>
        <relation weight="100">
          <termId>49556</termId>
          <relationType>BT</relationType>
          <termName>General Active Personnel</termName>
          <termVocabulary>People Status Global Updated</termVocabulary>
        </relation>
      </term>
      <term>
        <termId>49554</termId>
        <termUpdate>add</termUpdate>
        <termName>General Active Personnel</termName>
        <termVocabulary>People Status Global</termVocabulary>
        <termCategory>PDI</termCategory>
      </term>
    </Zthes>
  </FileData>
</GetSavedReportResponse>   

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

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:template match="/">
    <xsl:if test="termCategory">
      <xsl:if test="substring(FileData/Zthes/term/termCategory, 1, 2) = 'GL'">
        <xsl:copy>
          <xsl:apply-templates select="term"/>
        </xsl:copy>
      </xsl:if>
    </xsl:if>
  </xsl:template>
</xsl:stylesheet>

Но это не работает нормально.Здесь вывод должен быть:

<GetSavedReportResponse xmlns="">
  <ResponseType>Success</ResponseType>
  <FileModifiedDateTime>2012-01-03T17:05:04</FileModifiedDateTime>
  <FileSizeBytes>7816</FileSizeBytes>
  <FileDataFormat>XML</FileDataFormat>
  <FileData>
    <Zthes>
      <term>
        <termId>49555</termId>
        <termUpdate>add</termUpdate>
        <termName>Active Personnel</termName>
        <termVocabulary>People Status Global</termVocabulary>
        <termVocabulary>Employee Status Global</termVocabulary>
        <termCategory>PDA</termCategory>
        <termCategory>PDI</termCategory>
        <termCategory>GLB</termCategory>
        <relation weight="100">
          <relationType>EQ</relationType>
          <termName>term name</termName>
          <termVocabulary>term vocabulary</termVocabulary>
        </relation>
        <relation weight="100">
          <relationType>BT</relationType>
          <termName>General Active Personnel</termName>
          <termVocabulary>People Status Global Updated</termVocabulary>
        </relation>
      </term>
      <term>
    </Zthes>
  </FileData>
</GetSavedReportResponse>

ps: Положение подстроки не фиксировано, поэтому я не могу использовать старты с и т. Д.Я должен использовать SubString.Таким образом, в приведенном выше примере, например: третий термин категории первого термина содержит «GL», следовательно, он должен быть восстановлен.Второе слагаемое имеет одну termCategory, но не содержит «GL», следовательно, его не следует извлекать.Пожалуйста, помогите мне, где я делаю неправильно.Заранее спасибо.

С уважением

Ответы [ 2 ]

1 голос
/ 13 января 2012

Вы хотите исключить из вывода любой term, у которого нет termCategory, строковое значение которого начинается с "GL":

<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="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="term[not(termCategory[starts-with(.,'GL')])]"/>
</xsl:stylesheet>

когда это преобразование применяется к предоставленному документу XML :

<GetSavedReportResponse xmlns="">
    <ResponseType>Success</ResponseType>
    <FileModifiedDateTime>2012-01-03T17:05:04</FileModifiedDateTime>
    <FileSizeBytes>7816</FileSizeBytes>
    <FileDataFormat>XML</FileDataFormat>
    <FileData>
        <Zthes>
            <term>
                <termId>49555</termId>
                <termUpdate>add</termUpdate>
                <termName>Active Personnel</termName>
                <termVocabulary>People Status Global</termVocabulary>
                <termVocabulary>Employee Status Global</termVocabulary>
                <termCategory>PDA</termCategory>
                <termCategory>PDI</termCategory>
                <termCategory>GLB</termCategory>
                <relation weight="100">
                    <relationType>EQ</relationType>
                    <termName>term name</termName>
                    <termVocabulary>term vocabulary</termVocabulary>
                </relation>
                <relation weight="100">
                    <relationType>BT</relationType>
                    <termName>General Active Personnel</termName>
                    <termVocabulary>People Status Global Updated</termVocabulary>
                </relation>
            </term>
            <term>
                <termId>49554</termId>
                <termUpdate>add</termUpdate>
                <termName>General Active Personnel</termName>
                <termVocabulary>People Status Global</termVocabulary>
                <termCategory>PDI</termCategory>
            </term>
        </Zthes>
    </FileData>
</GetSavedReportResponse>

желаемый, правильный результат получается :

<GetSavedReportResponse>
   <ResponseType>Success</ResponseType>
   <FileModifiedDateTime>2012-01-03T17:05:04</FileModifiedDateTime>
   <FileSizeBytes>7816</FileSizeBytes>
   <FileDataFormat>XML</FileDataFormat>
   <FileData>
      <Zthes>
         <term>
            <termId>49555</termId>
            <termUpdate>add</termUpdate>
            <termName>Active Personnel</termName>
            <termVocabulary>People Status Global</termVocabulary>
            <termVocabulary>Employee Status Global</termVocabulary>
            <termCategory>PDA</termCategory>
            <termCategory>PDI</termCategory>
            <termCategory>GLB</termCategory>
            <relation weight="100">
               <relationType>EQ</relationType>
               <termName>term name</termName>
               <termVocabulary>term vocabulary</termVocabulary>
            </relation>
            <relation weight="100">
               <relationType>BT</relationType>
               <termName>General Active Personnel</termName>
               <termVocabulary>People Status Global Updated</termVocabulary>
            </relation>
         </term>
      </Zthes>
   </FileData>
</GetSavedReportResponse>

Объяснение : переопределение правила идентификации с одним шаблоном, который соответствует любому term, который не имеет termCategory дочернего элемента, значение которого начинается со строкой "GL". Этот переопределяющий шаблон имеет пустое тело - таким образом, фактически исключая (удаляя) из вывода любой соответствующий узел.

0 голосов
/ 13 января 2012

Не уверен, но может ли быть так, что вы хотите вместо

      <xsl:value-of select="relation/termId/text()" />

?

Хотя у вас нет relation/termId в вашем xml ...

Кроме того, во втором примере вы получаете доступ к FileData относительно GetSavedReportResponse узла, а не к /, в каком контексте вы его оцениваете.

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