XSLT: Условное исключение / замена текста - PullRequest
0 голосов
/ 01 ноября 2018

Мне впервые было поручено сделать xslt в качестве POC и наткнуться на решение. Вопрос я имея возможность заменить содержимое узла тем, что возвращается моей функцией, когда происходит совпадение. На В тот момент, когда у меня возникают проблемы с его объединением, так что исходный текст внутри тега run также не просматривается. поскольку это должно быть заменено содержанием, определенным моей функцией handle-links, когда тест равен TRUE. michael.hor257k дал несколько хороших советов по моей проблеме в предыдущем посте, который сейчас закрыт, но я все еще озадачен правильным синтаксисом Мне нужно подать заявку для достижения желаемого результата. Если бы кто-то мог помочь мне в правильных изменениях, чтобы сделать это отлично и высоко ценится.

С учетом следующего XML.

<?xml version="1.0" encoding="UTF-8"?>
<catalog>
    <par def='15'>
        <run>
            <font size='8pt' name='Verdana' pitch='variable' truetype='true'
 familyid='20' color='navy'/>[&lt;a href="www.google.com.au" target="_new"&gt;Google&lt;/a&gt;]
        </run>
    </par>
</catalog>

И применение правильного XSLT (с которым мне нужна помощь)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/">
        <html>
            <body>
                <h2>My Transform</h2>  
                <xsl:apply-templates/>  
            </body>
        </html>
    </xsl:template>

    <xsl:template match="run">
        <font name='Verdana' size='14pt'>
            <xsl:call-template name="handle-links">
                <xsl:with-param name="txt" select="."/>
            </xsl:call-template>
        </font>
    </xsl:template>

    <xsl:template name="handle-links">

        <xsl:param name="txt"/>

        <xsl:if
            test="contains($txt,'[&lt;a')">

            <xsl:variable name="quotes">"</xsl:variable>    

            <!-- Get URL -->
            <xsl:variable name="urlVar" select='substring-before(substring-after($txt, $quotes), $quotes)'/> 

            <!-- Get Link Name -->
            <xsl:variable name="linkName" select='substring-before(substring-after($txt, "&gt;"), "&lt;")'/> 

            <a href="{$urlVar}">
                <xsl:value-of select="$linkName"/>
            </a>
        </xsl:if>

    </xsl:template>

</xsl:stylesheet>

Я пытаюсь добиться чего-то подобного приведенному ниже, ЕСЛИ И ТОЛЬКО ЕСЛИ test test = "contains ($ txt, '[ true.

<font name='Verdana' size='14pt'>
    <a href="www.google.com">Google</a>
</font>

Если тест test="contains($txt,'[&lt;a')"> равен FALSE, тогда я просто хочу, чтобы теги <font name = 'Verdana' size='14pt'> </font> окружали содержимое text() элемента run.

Приветствия

1 Ответ

0 голосов
/ 02 ноября 2018

Один из способов - использовать xsl:choose вместо xsl:if

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <html>
      <body>
        <h2>My Transform</h2>  
        <xsl:apply-templates/>  
      </body>
    </html>
  </xsl:template>

  <xsl:template match="run">
    <font name='Verdana' size='14pt'>
      <xsl:call-template name="handle-links">
        <xsl:with-param name="txt" select="."/>
      </xsl:call-template>
    </font>
  </xsl:template>

  <xsl:template name="handle-links">
    <xsl:param name="txt"/>
    <xsl:choose>
     <xsl:when test="contains($txt,'[&lt;a')">
        <xsl:variable name="quotes">"</xsl:variable>  
          <!-- Get URL -->
        <xsl:variable name="urlVar" select='substring-before(substring-after($txt, $quotes), $quotes)'/> 
          <!-- Get Link Name -->
        <xsl:variable name="linkName" select='substring-before(substring-after($txt, "&gt;"), "&lt;")'/> 

        <a href="{$urlVar}">
          <xsl:value-of select="$linkName"/>
        </a>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$txt" />
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>

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

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <html>
      <body>
        <h2>My Transform</h2>  
        <xsl:apply-templates/>  
      </body>
    </html>
  </xsl:template>

  <xsl:template match="run">
    <font name='Verdana' size='14pt'>
      <xsl:apply-templates select="text()" />
    </font>
  </xsl:template>

  <xsl:template match="run/text()[contains(.,'[&lt;a')]">
    <xsl:variable name="quotes">"</xsl:variable>  
      <!-- Get URL -->
    <xsl:variable name="urlVar" select='substring-before(substring-after(., $quotes), $quotes)'/> 
      <!-- Get Link Name -->
    <xsl:variable name="linkName" select='substring-before(substring-after(., "&gt;"), "&lt;")'/> 

    <a href="{$urlVar}">
      <xsl:value-of select="$linkName"/>
    </a>
  </xsl:template>
</xsl:stylesheet>

Если текст не содержит ссылки, встроенные шаблоны XSLT просто выводят текст в обычном режиме.

См. Это в действии на http://xsltfiddle.liberty -development.net / pPqsHUn (Этот веб-сайт чрезвычайно полезен для экспериментов и отладки. Он также поддерживает XSLT 3.0, который, если вы могли бы использовать, позволил бы вам используйте команду parse-xml , чтобы потенциально упростить создание ссылки).

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