如何将一个周期用于不同的标签

时间:2019-02-19 08:27:02

标签: xslt foreach

我有带有相同标签的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-each命令将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 :(得分:0)

您应该使用模板匹配来更改节点名称。

首先选择所有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>

答案 1 :(得分:0)

从给出的示例中看不到需要应用的逻辑。也许您需要做的就是:

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>