Как добавить пользовательские теги в xslt?

можем ли мы добавить пользовательский тег или функцию в XSLT. Я объясню еще раз, я добавил один тегinclude-html в свою демонстрацию. можем ли мы добавить какую-либо логику в XSLT, когда мы находим include-html в моей таблице стилей, он соответствует этому шаблону со значением тега (так же, как мы делаем в apply-template ) и получить его значения и показать в выводе.

вот мой код. http://xsltransform.net/6pS1zDt/1

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />

    <xsl:template match="/">
      <hmtl>
        <head>
          <title>New Version!</title>
        </head>
        <include-html>a</include-html>
      </hmtl>
    </xsl:template>

   <xsl:template match="a">
  <xsl:variable name="ab" select="'ss'"/>
   <p><xsl:value-of select="$ab"/></p>
</xsl:template>
</xsl:transform>

В моем примере я пишу значение a из значения include-html. Нет, оно соответствует шаблону и возвращает **<p>ss</p>**

<include-html>a</include-html>

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

**<p>ss</p>**

person naveen    schedule 05.09.2017    source источник
comment
вам нужно начать сначала w3schools.com/xml/xsl_intro.asp   -  person Matthew Whited    schedule 05.09.2017
comment
@MatthewWhited я знаю эту штуку   -  person naveen    schedule 05.09.2017


Ответы (1)


Этого можно добиться с помощью некоторой метатаблицы стилей (назовем ее test.xslt):

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />

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

    <xsl:template match="/whatever">
      <hmtl>
        <head>
          <title>New Version!</title>
        </head>
        <include-html>a</include-html>
      </hmtl>
    </xsl:template>

  <xsl:template match="include-html[text()='a']">
    <xsl:variable name="ab" select="'ss'"/>
    <p><xsl:value-of select="$ab"/></p>
  </xsl:template>

</xsl:transform>

Если вы передадите это процессору XSLT как ввод XSLT и XML, например

xsl.sh test.xslt test.xslt

вывод

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="xml"
               omit-xml-declaration="yes"
               encoding="UTF-8"
               indent="yes"/>

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

    <xsl:template match="/whatever">     <!-- must NOT match -->
      <hmtl>
        <head>
            <title>New Version!</title>
        </head>
        <p>ss</p>                        <!-- REPLACED! -->
      </hmtl>
    </xsl:template>

  <xsl:template match="include-html[text()='a']">
      <xsl:variable name="ab" select="'ss'"/>
      <p>
         <xsl:value-of select="$ab"/>
      </p>
  </xsl:template>

</xsl:transform>

что близко к тому, что вы хотите, я полагаю...

person zx485    schedule 05.09.2017