Как использовать один цикл для разных тегов - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть XML с разными одинаковыми тегами:

<?xml version="1.0" encoding="UTF-8"?>
<main>
  <ROUTES>
    <A1_NE>LSN/EMS_XDM_12/1021</A1_NE>
    <A2_NE>LSN/EMS_XDM_12/1022</A2_NE>
    <Z1_NE>LSN/EMS_XDM_12/1023</Z1_NE>
    <Z2_NE>LSN/EMS_XDM_12/1024</Z2_NE>
  </ROUTES>
  <ROUTES>
    <A1_NE>LSN/EMS_XDM_12/1001</A1_NE>
    <A2_NE>LSN/EMS_XDM_12/1002</A2_NE>
    <A3_NE>LSN/EMS_XDM_12/1003</A3_NE>
    <A4_NE>LSN/EMS_XDM_12/1004</A4_NE>
    <Z1_NE>LSN/EMS_XDM_12/1005</Z1_NE>
    <Z2_NE>LSN/EMS_XDM_12/1006</Z2_NE>
   </ROUTES>
</main>

XSLT:

<?xml version="1.1" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="no"/>
<xsl:template match="/">
    <MAIN>
        <xsl:for-each select="main/ROUTES"> 
            <xsl:element name="ROUTES">
                <A_NE><xsl:value-of select="A1_NE"/></A_NE>
                <A_NE><xsl:value-of select="A2_NE"/></A_NE>
                <A_NE><xsl:value-of select="A3_NE"/></A_NE>
                <A_NE><xsl:value-of select="A4_NE"/></A_NE>
                <Z_NE><xsl:value-of select="Z1_NE"/></Z_NE>
<Z_NE><xsl:value-of select="Z2_NE"/></Z_NE>
</xsl:element>
</xsl:for-each> 
</MAIN>
  </xsl:template> 
</xsl:stylesheet>

Как использовать команду for-каждой для преобразования A1_NE, A2_NE и т. Д. В столбец A_NE?А также я не понимаю, как я могу узнать номер строки в исходном XML.

Perhabs xslt версии 1.0 не удалось выполнить это преобразование.

<?xml version="1.0" encoding="UTF-8"?>
<main>
<ROUTES>
<A_NE>LSN/EMS_XDM_12/1021</A_NE>
<A_NE>LSN/EMS_XDM_12/1022</A_NE>
<Z_NE>LSN/EMS_XDM_12/1023</Z_NE>
<Z_NE>LSN/EMS_XDM_12/1024</Z_NE>
<A_NE>LSN/EMS_XDM_12/1001</A_NE>
<A_NE>LSN/EMS_XDM_12/1002</A_NE>
<A_NE>LSN/EMS_XDM_12/1003</A_NE>
<A_NE>LSN/EMS_XDM_12/1004</A_NE>
<Z_NE>LSN/EMS_XDM_12/1005</Z_NE>
<Z_NE>LSN/EMS_XDM_12/1006</Z_NE>
</ROUTES>
</main>

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Логика, которую необходимо применить, не очевидна из приведенного примера.Возможно, все, что вам нужно сделать, это:

XSLT 1.0

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

<xsl:template match="/main">
    <main>
        <ROUTES>
            <xsl:for-each select="ROUTES/*"> 
                <xsl:element name="{translate(name(), '1234567890', '')}">
                    <xsl:value-of select="." />
                </xsl:element>
            </xsl:for-each>     
       </ROUTES>
    </main>
</xsl:template>

</xsl:stylesheet>
0 голосов
/ 19 февраля 2019

Для изменения имен узлов следует использовать сопоставление с шаблоном.

Сначала выберите дочерние узлы для всех ROUTES, например, так:

<xsl:apply-templates select="main/ROUTES/*" />

Затем создайте шаблоны, подобныеэто, например, сделать переименование

<xsl:template match="A1_NE|A2_NE|A3_NE|A4_NE">
  <A_NE><xsl:value-of select="."/></A_NE>
</xsl:template>

Попробуйте это XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/">
    <main>
      <ROUTES>
        <xsl:apply-templates select="main/ROUTES/*" /> 
      </ROUTES>
    </main>
  </xsl:template> 

  <xsl:template match="A1_NE|A2_NE|A3_NE|A4_NE">
    <A_NE><xsl:value-of select="."/></A_NE>
  </xsl:template>

  <xsl:template match="Z1_NE|Z2_NE|Z3_NE|Z4_NE">
    <Z_NE><xsl:value-of select="."/></Z_NE>
  </xsl:template>
</xsl:stylesheet>

В качестве альтернативы, если это действительно ваши настоящие имена элементов, вы можете попытаться сделать его общим

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/">
    <main>
      <ROUTES>
        <xsl:apply-templates select="main/ROUTES/*" /> 
      </ROUTES>
    </main>
  </xsl:template> 

  <xsl:template match="ROUTES/*">
    <xsl:element name="{substring(local-name(), 1, 1)}_{substring-after(local-name(), '_')}">
      <xsl:value-of select="."/>
    </xsl:element>
  </xsl:template>
</xsl:stylesheet>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...