Для каждого применять шаблоны XSLT - PullRequest
0 голосов
/ 30 января 2020

Я разместил этот вопрос здесь. Ответ был дан, и я доволен этим. Это просто здесь для ссылки на вход и выход XML. Преобразование XSLT

XML в XML. MS XML в VBScript

Вот моя таблица стилей:

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:b="urn:myNameSpace" exclude-result-prefixes="b">

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/b:MYImportFile">

<MYImportFile>

    <xsl:for-each select="b:SAMPLE">

    <SAMPLE>

        <SAMPLEID>
        <xsl:value-of select="b:SAMPLEID"/>
        </SAMPLEID>

        <NAME1_1>
        <xsl:value-of select="b:LOCATION/b:LOCATIONNAME[text() = 'NAME1']/../b:DATA[1]/b:DATAVALUE"/>
        </NAME1_1>

        <xsl:choose> 
            <xsl:when test="b:LOCATION/b:LOCATIONNAME[text() = 'NAME1']/../b:DATA[2]/b:DATAVALUE">
                <NAME1_2>
                <xsl:value-of select="b:LOCATION/b:LOCATIONNAME[text() = 'NAME1']/../b:DATA[2]/b:DATAVALUE"/>
                </NAME1_2>
            </xsl:when>
            <xsl:otherwise>
                <NAME1_2>
                <xsl:value-of select="b:LOCATION/b:LOCATIONNAME[text() = 'NAME1']/../b:DATA[1]/b:DATAVALUE"/>
                </NAME1_2>
            </xsl:otherwise>
        </xsl:choose>


        '''''''''''''''''''there are 100 NAME entires to recieve the 100 locations

    </SAMPLE>

    </xsl:for-each>

</MYImportFile>

</xsl:template>
</xsl:stylesheet>

Какие изменения мне нужно внести в это, чтобы сделать это </xsl:for-each> в <xsl:apply-templates>? Это легкое изменение? Или это будет пересмотр всей таблицы стилей?

1 Ответ

1 голос
/ 30 января 2020

Если есть повторения одного и того же кода, может быть возможно реализовать их в шаблоне, так что пересмотр в любом случае полезен:

<xsl:stylesheet
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:b="urn:ohLookHEREaNamespacedeclaration"
    exclude-result-prefixes="b"
    version="1.0">

  <xsl:strip-space elements="*"/>

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/*">
     <xsl:element name="{local-name()}">
        <xsl:apply-templates select="b:SAMPLE"/>
     </xsl:element>
  </xsl:template>

  <xsl:template match="b:SAMPLE">
      <xsl:element name="{local-name()}">
          <xsl:apply-templates select="b:SAMPLEID | b:LOCATION"/>
      </xsl:element>
  </xsl:template>

  <xsl:template match="*">
      <xsl:element name="{local-name()}">
          <xsl:apply-templates/>
      </xsl:element>
  </xsl:template>

  <xsl:template match="b:LOCATION">
      <xsl:element name="{b:LOCATIONNAME}_1">
          <xsl:value-of select="b:DATA[1]/b:DATAVALUE"/>
      </xsl:element>
      <xsl:element name="{b:LOCATIONNAME}_2">
          <xsl:value-of select="b:DATA[2]/b:DATAVALUE | b:DATA[1][current()[not(b:DATA[2])]]/b:DATAVALUE"/>
      </xsl:element>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/bFWRAp3

Но в целом вместо <xsl:for-each select="foo"><bar>...</bar></xsl:for-each> вы, конечно, можете использовать <xsl:apply-templates select="foo"/> с соответствующим <xsl:template match="foo"><bar>...</bar></xsl:template>, если это ваш главный вопрос.

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