使用xslt将xml转换为新布局

时间:2017-10-04 16:29:08

标签: xml xslt

我需要使用xslt转换xml,以便将所有节点都放在一起 “ans:numeroGuiaOrigem”和“ans:numeroGuiaOperadora”进入相同的“ans:opcaoRecursoGuia”节点。

我已经在源xml和所需的xml下面发布了。

我是xslt的新手。我已经阅读了一些论文,但我没有成功进行这种转变。

有人可以帮助我吗?

我的xslt是:

[HttpGet("{id:int}")]
public string GetById(int id)
{
   return id.ToString();
}

[HttpGet("{name}")]
public string GetByName(string name)
{
   return name + " name";
}

//源

<xsl:transform
  version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:ans="http://www.ans.gov.br/padroes/tiss/schemas">
  <xsl:output method="xml" encoding="UTF-8" indent="yes" />
  <xsl:strip-space elements="*" />

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

  <xsl:template match="ans:opcaoRecursoGuia">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()" />
      <xsl:for-each select=".//ans:itensGuia" >
        <xsl:copy>
          <xsl:copy-of select="ans:itensGuia" />
          </xsl:copy>
      </xsl:for-each>
    </xsl:copy>
  </xsl:template>
</xsl:transform>

//需要

    <?xml version="1.0" encoding="ISO-8859-1"?>
    <ans:mensagemTISS xmlns:ans="http://www.ans.gov.br/padroes/tiss/schemas" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ans.gov.br/padroes/tiss/schemas http://www.ans.gov.br/padroes/tiss/schemas/tissV3_02_00.xsd">
      <ans:cabecalho>
        <ans:versaoPadrao>3.02.00</ans:versaoPadrao>
      </ans:cabecalho>
      <ans:prestadorParaOperadora>
        <ans:recursoGlosa>
          <ans:guiaRecursoGlosa>
            <ans:registroANS>005711</ans:registroANS>
            <ans:numeroGuiaRecGlosaPrestador>431089079</ans:numeroGuiaRecGlosaPrestador>
            <ans:opcaoRecurso>
              <ans:recursoGuia>
                <ans:numeroGuiaOrigem>430912301</ans:numeroGuiaOrigem>
                <ans:numeroGuiaOperadora>24000000000605290391</ans:numeroGuiaOperadora>
                <ans:opcaoRecursoGuia>
                  <ans:itensGuia>
                    <ans:dataInicio>2017-06-23</ans:dataInicio>
                    <ans:dataFim>2017-06-23</ans:dataFim>
                    <ans:procRecurso>
                      <ans:codigoTabela>18</ans:codigoTabela>
                    </ans:procRecurso>
                    <ans:justificativaItem>VALOR CORRETO ATUAL -TAXA DE SALA UTILIZADA PARA PROCEDIMENTOS CONFORME ACORDO ENTRE PARTES-valor correto </ans:justificativaItem>
                  </ans:itensGuia>
                </ans:opcaoRecursoGuia>
              </ans:recursoGuia>
              <ans:recursoGuia>
                <ans:numeroGuiaOrigem>430912301</ans:numeroGuiaOrigem>
                <ans:numeroGuiaOperadora>24000000000605290391</ans:numeroGuiaOperadora>
                <ans:opcaoRecursoGuia>
                  <ans:itensGuia>
                    <ans:dataInicio>2017-06-23</ans:dataInicio>
                    <ans:dataFim>2017-06-23</ans:dataFim>
                    <ans:procRecurso>
                      <ans:codigoTabela>20</ans:codigoTabela>
                    </ans:procRecurso>
                    <ans:justificativaItem> com acrescimo de 38,24%  contempla a remuneração pelos serviços de seleção,armazenamento,distribuição</ans:justificativaItem>
                  </ans:itensGuia>
                </ans:opcaoRecursoGuia>
              </ans:recursoGuia>
              <ans:recursoGuia>
                <ans:numeroGuiaOrigem>430912302</ans:numeroGuiaOrigem>
                <ans:numeroGuiaOperadora>24000000000605290392</ans:numeroGuiaOperadora>
                <ans:opcaoRecursoGuia>
                  <ans:itensGuia>
                    <ans:dataInicio>2017-06-23</ans:dataInicio>
                    <ans:dataFim>2017-06-23</ans:dataFim>
                    <ans:procRecurso>
                      <ans:codigoTabela>18</ans:codigoTabela>
                    </ans:procRecurso>
                    <ans:justificativaItem>VALOR CORRETO ATUAL -TAXA DE SALA UTILIZADA PARA PROCEDIMENTOS CONFORME ACORDO ENTRE PARTES-valor correto </ans:justificativaItem>
                  </ans:itensGuia>
                </ans:opcaoRecursoGuia>
              </ans:recursoGuia>
              <ans:recursoGuia>
                <ans:numeroGuiaOrigem>430912302</ans:numeroGuiaOrigem>
                <ans:numeroGuiaOperadora>24000000000605290392</ans:numeroGuiaOperadora>
                <ans:opcaoRecursoGuia>
                  <ans:itensGuia>
                    <ans:dataInicio>2017-06-23</ans:dataInicio>
                    <ans:dataFim>2017-06-23</ans:dataFim>
                    <ans:procRecurso>
                      <ans:codigoTabela>20</ans:codigoTabela>
                    </ans:procRecurso>
                    <ans:justificativaItem> com acrescimo de 38,24%  contempla a remuneração pelos serviços de seleção,armazenamento,distribuição</ans:justificativaItem>
                  </ans:itensGuia>
                </ans:opcaoRecursoGuia>
              </ans:recursoGuia>
              <ans:recursoGuia>
                <ans:numeroGuiaOrigem>430912303</ans:numeroGuiaOrigem>
                <ans:numeroGuiaOperadora>24000000000605290393</ans:numeroGuiaOperadora>
                <ans:opcaoRecursoGuia>
                  <ans:itensGuia>
                    <ans:dataInicio>2017-06-23</ans:dataInicio>
                    <ans:dataFim>2017-06-23</ans:dataFim>
                    <ans:procRecurso>
                      <ans:codigoTabela>18</ans:codigoTabela>
                    </ans:procRecurso>
                    <ans:justificativaItem>VALOR CORRETO ATUAL -TAXA DE SALA UTILIZADA PARA PROCEDIMENTOS CONFORME ACORDO ENTRE PARTES-valor correto </ans:justificativaItem>
                  </ans:itensGuia>
                </ans:opcaoRecursoGuia>
              </ans:recursoGuia>
              <ans:recursoGuia>
                <ans:numeroGuiaOrigem>430912303</ans:numeroGuiaOrigem>
                <ans:numeroGuiaOperadora>24000000000605290393</ans:numeroGuiaOperadora>
                <ans:opcaoRecursoGuia>
                  <ans:itensGuia>
                    <ans:dataInicio>2017-06-23</ans:dataInicio>
                    <ans:dataFim>2017-06-23</ans:dataFim>
                    <ans:procRecurso>
                      <ans:codigoTabela>20</ans:codigoTabela>
                    </ans:procRecurso>
                    <ans:justificativaItem> com acrescimo de 38,24%  contempla a remuneração pelos serviços de seleção,armazenamento,distribuição</ans:justificativaItem>
                  </ans:itensGuia>
                </ans:opcaoRecursoGuia>
              </ans:recursoGuia>
              <ans:recursoGuia>
                <ans:numeroGuiaOrigem>430912304</ans:numeroGuiaOrigem>
                <ans:numeroGuiaOperadora>24000000000605290394</ans:numeroGuiaOperadora>
                <ans:opcaoRecursoGuia>
                  <ans:itensGuia>
                    <ans:dataInicio>2017-06-27</ans:dataInicio>
                    <ans:dataFim>2017-06-27</ans:dataFim>
                    <ans:procRecurso>
                      <ans:codigoTabela>18</ans:codigoTabela>
                    </ans:procRecurso>
                    <ans:justificativaItem>VALOR CORRETO ATUAL -TAXA DE SALA UTILIZADA PARA PROCEDIMENTOS CONFORME ACORDO ENTRE PARTES-valor correto </ans:justificativaItem>
                  </ans:itensGuia>
                </ans:opcaoRecursoGuia>
              </ans:recursoGuia>
            </ans:opcaoRecurso>
          </ans:guiaRecursoGlosa>
        </ans:recursoGlosa>
      </ans:prestadorParaOperadora>
     </ans:mensagemTISS>

1 个答案:

答案 0 :(得分:2)

这是muenchian-grouping的情况,可以使用<xsl:key>来执行分组。由于正在使用XSLT 1.0,因此下面的解释是根据使用的版本。

正如问题中所指定的,需要对<ans:numeroGuiaOrigem><ans:numeroGuiaOperadora>节点中的值进行分组。因此,使用|分隔符将合成密钥定义如下。

<xsl:key name="grpKey" match="ans:recursoGuia" use="concat(ans:numeroGuiaOrigem,'|',ans:numeroGuiaOperadora)" />

使用此密钥,可以为<ans:recursoGuia>节点进行模板匹配。

<xsl:template match="ans:recursoGuia[generate-id() = generate-id(key('grpKey',concat(ans:numeroGuiaOrigem,'|',ans:numeroGuiaOperadora))[1])]">

完整的XSLT如下所示。

<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ans="http://www.ans.gov.br/padroes/tiss/schemas">
    <xsl:output method="xml" encoding="UTF-8" indent="yes" />
    <xsl:strip-space elements="*" />

    <!-- create grouping key using the required nodes -->
    <xsl:key name="grpKey" match="ans:recursoGuia" use="concat(ans:numeroGuiaOrigem,'|',ans:numeroGuiaOperadora)" />

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

    <!-- match templates according to grouping key -->
    <xsl:template match="ans:recursoGuia[generate-id() = generate-id(key('grpKey',concat(ans:numeroGuiaOrigem,'|',ans:numeroGuiaOperadora))[1])]">
        <ans:recursoGuia>
            <!-- copy elements except <ans:opcaoRecursoGuia> -->
            <xsl:apply-templates select="*[not(self::ans:opcaoRecursoGuia)]" />
            <!-- create new element <ans:opcaoRecursoGuia> -->
            <ans:opcaoRecursoGuia>
                <!-- copy all grouped <ans:itensGuia> elements -->
                <xsl:apply-templates select="key('grpKey',concat(ans:numeroGuiaOrigem,'|',ans:numeroGuiaOperadora))/ans:opcaoRecursoGuia/ans:itensGuia" />
            </ans:opcaoRecursoGuia>
        </ans:recursoGuia>
    </xsl:template>

    <!-- no processing on the remaining <ans:recursoGuia> nodes  -->
    <xsl:template match="ans:recursoGuia" />
</xsl:transform>

输出

<ans:mensagemTISS xmlns:ans="http://www.ans.gov.br/padroes/tiss/schemas"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.ans.gov.br/padroes/tiss/schemas http://www.ans.gov.br/padroes/tiss/schemas/tissV3_02_00.xsd">
    <ans:cabecalho>
        <ans:versaoPadrao>3.02.00</ans:versaoPadrao>
    </ans:cabecalho>
    <ans:prestadorParaOperadora>
        <ans:recursoGlosa>
            <ans:guiaRecursoGlosa>
                <ans:registroANS>005711</ans:registroANS>
                <ans:numeroGuiaRecGlosaPrestador>431089079</ans:numeroGuiaRecGlosaPrestador>
                <ans:opcaoRecurso>
                    <ans:recursoGuia>
                        <ans:numeroGuiaOrigem>430912301</ans:numeroGuiaOrigem>
                        <ans:numeroGuiaOperadora>24000000000605290391</ans:numeroGuiaOperadora>
                        <ans:opcaoRecursoGuia>
                            <ans:itensGuia>
                                <ans:dataInicio>2017-06-23</ans:dataInicio>
                                <ans:dataFim>2017-06-23</ans:dataFim>
                                <ans:procRecurso>
                                    <ans:codigoTabela>18</ans:codigoTabela>
                                </ans:procRecurso>
                                <ans:justificativaItem>VALOR CORRETO ATUAL -TAXA DE SALA UTILIZADA PARA PROCEDIMENTOS CONFORME ACORDO ENTRE PARTES-valor correto </ans:justificativaItem>
                            </ans:itensGuia>
                            <ans:itensGuia>
                                <ans:dataInicio>2017-06-23</ans:dataInicio>
                                <ans:dataFim>2017-06-23</ans:dataFim>
                                <ans:procRecurso>
                                    <ans:codigoTabela>20</ans:codigoTabela>
                                </ans:procRecurso>
                                <ans:justificativaItem> com acrescimo de 38,24% contempla a remuneração pelos serviços de seleção,armazenamento,distribuição</ans:justificativaItem>
                            </ans:itensGuia>
                        </ans:opcaoRecursoGuia>
                    </ans:recursoGuia>
                    <ans:recursoGuia>
                        <ans:numeroGuiaOrigem>430912302</ans:numeroGuiaOrigem>
                        <ans:numeroGuiaOperadora>24000000000605290392</ans:numeroGuiaOperadora>
                        <ans:opcaoRecursoGuia>
                            <ans:itensGuia>
                                <ans:dataInicio>2017-06-23</ans:dataInicio>
                                <ans:dataFim>2017-06-23</ans:dataFim>
                                <ans:procRecurso>
                                    <ans:codigoTabela>18</ans:codigoTabela>
                                </ans:procRecurso>
                                <ans:justificativaItem>VALOR CORRETO ATUAL -TAXA DE SALA UTILIZADA PARA PROCEDIMENTOS CONFORME ACORDO ENTRE PARTES-valor correto </ans:justificativaItem>
                            </ans:itensGuia>
                            <ans:itensGuia>
                                <ans:dataInicio>2017-06-23</ans:dataInicio>
                                <ans:dataFim>2017-06-23</ans:dataFim>
                                <ans:procRecurso>
                                    <ans:codigoTabela>20</ans:codigoTabela>
                                </ans:procRecurso>
                                <ans:justificativaItem> com acrescimo de 38,24% contempla a remuneração pelos serviços de seleção,armazenamento,distribuição</ans:justificativaItem>
                            </ans:itensGuia>
                        </ans:opcaoRecursoGuia>
                    </ans:recursoGuia>
                    <ans:recursoGuia>
                        <ans:numeroGuiaOrigem>430912303</ans:numeroGuiaOrigem>
                        <ans:numeroGuiaOperadora>24000000000605290393</ans:numeroGuiaOperadora>
                        <ans:opcaoRecursoGuia>
                            <ans:itensGuia>
                                <ans:dataInicio>2017-06-23</ans:dataInicio>
                                <ans:dataFim>2017-06-23</ans:dataFim>
                                <ans:procRecurso>
                                    <ans:codigoTabela>18</ans:codigoTabela>
                                </ans:procRecurso>
                                <ans:justificativaItem>VALOR CORRETO ATUAL -TAXA DE SALA UTILIZADA PARA PROCEDIMENTOS CONFORME ACORDO ENTRE PARTES-valor correto </ans:justificativaItem>
                            </ans:itensGuia>
                            <ans:itensGuia>
                                <ans:dataInicio>2017-06-23</ans:dataInicio>
                                <ans:dataFim>2017-06-23</ans:dataFim>
                                <ans:procRecurso>
                                    <ans:codigoTabela>20</ans:codigoTabela>
                                </ans:procRecurso>
                                <ans:justificativaItem> com acrescimo de 38,24% contempla a remuneração pelos serviços de seleção,armazenamento,distribuição</ans:justificativaItem>
                            </ans:itensGuia>
                        </ans:opcaoRecursoGuia>
                    </ans:recursoGuia>
                    <ans:recursoGuia>
                        <ans:numeroGuiaOrigem>430912304</ans:numeroGuiaOrigem>
                        <ans:numeroGuiaOperadora>24000000000605290394</ans:numeroGuiaOperadora>
                        <ans:opcaoRecursoGuia>
                            <ans:itensGuia>
                                <ans:dataInicio>2017-06-27</ans:dataInicio>
                                <ans:dataFim>2017-06-27</ans:dataFim>
                                <ans:procRecurso>
                                    <ans:codigoTabela>18</ans:codigoTabela>
                                </ans:procRecurso>
                                <ans:justificativaItem>VALOR CORRETO ATUAL -TAXA DE SALA UTILIZADA PARA PROCEDIMENTOS CONFORME ACORDO ENTRE PARTES-valor correto </ans:justificativaItem>
                            </ans:itensGuia>
                        </ans:opcaoRecursoGuia>
                    </ans:recursoGuia>
                </ans:opcaoRecurso>
            </ans:guiaRecursoGlosa>
        </ans:recursoGlosa>
    </ans:prestadorParaOperadora>
</ans:mensagemTISS>