Как применять шаблоны динамически с помощью name ()? - PullRequest
0 голосов
/ 26 апреля 2018

Я преобразую XSLT в JSON из исходного XML. Я хочу, чтобы элементы типа массива были преобразованы в "elements: []"

Из данного xslt я сопоставляю имя узла и применяю шаблон. Но как сделать это динамически для каждого элемента типа массива, или я могу выбрать, какой элемент необходимо преобразовать в элемент типа массива в JSON.

Вот мой исходный XML

<order>
  <email>mark.h@yopmail.com</email>
<tax-lines>
    <tax-line>
      <title>CGST</title>
      <price>29.00</price>
      <rate>0.2</rate>
    </tax-line>  
  </tax-lines>

  <freight-Lines>
    <freight-Line>
      <title>CGST</title>
      <price>29.00</price>
      <rate>0.2</rate>
    </freight-Line>
  </freight-Lines>
</order>

XSLT:

  <xsl:when test="name()= 'tax-lines'">
         [<xsl:apply-templates select="*" mode="ArrayElement"/>] 
      </xsl:when>

Используя это, я получаю вывод Json как:

    {

    "order" :
        {

    "email" :"mark.h@yopmail.com",
    "tax-lines" :
         [
        {

    "title" :"CGST",
    "price" :"29.00",
    "rate" :"0.2"
        }
      ] 

        }
      }

Есть ли способ, с помощью которого я могу сделать то же самое для массива 'freight-Lines' динамически? Означает, что я хочу сделать эту строку динамически

<xsl:when test="name()= 'tax-lines'">
         [<xsl:apply-templates select="*" mode="ArrayElement"/>] 
      </xsl:when>

1 Ответ

0 голосов
/ 26 апреля 2018

Один из подходов к этому - управление преобразованием с использованием некоторой схемы сопоставления.Таким образом, у вас может быть:

Из этого вы можете сгенерировать таблицу стилей, содержащую набор шаблонных правил, например:

<xsl:template match="tax-lines | freight-lines">
  <xsl:text>[</xsl:text>
  <xsl:for-each select="*">
    <xsl:if test="position() != 1">,</xsl:if>
    <xsl:apply-templates select="."/>
  <xsl:text>]</xsl:text>
</xsl:template>

<xsl:template match="tax-line | freight-line">
  <xsl:text>{</xsl:text>
  <xsl:for-each select="*">
    <xsl:if test="position() != 1">,</xsl:if>
    <xsl:text>"</xsl:text>
    <xsl:value-of select="local-name()"/>
    <xsl:text>":</xsl:text>
    <xsl:apply-templates select="."/>
  <xsl:text>}</xsl:text>
</xsl:template>

<xsl:template match="*[. castable as xs:double]">
  <xsl:value-of select="."/>
</xsl:template>

<xsl:template match="*">
  <xsl:text>"</xsl:text>
  <xsl:value-of select="."/>
  <xsl:text>"</xsl:text>
</xsl:template>

Таким образом, у вас в основном есть набор шаблоновкоторые используются для сопоставления различных XML-элементов с JSON, со скелетным шаблоном для каждого из них;Ваша схема сопоставления определяет, какой шаблон использовать для каждого элемента в исходном документе (по умолчанию), и затем вы преобразуете схему сопоставления в таблицу стилей, которая связывает каждое имя элемента с соответствующим правилом шаблона.

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