Лучший способ отобразить элементы xml в xslt - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть формат ниже xml.

<Floorplan IDValue="123" IDType="FloorplanID" IDRank="primary">
    <FloorplanInfo>info<FloorplanInfo>  
</Floorplan>
<Floorplan IDValue="456" IDType="FloorplanID" IDRank="primary">
    <FloorplanInfo>info<FloorplanInfo>  
</Floorplan>

<unit id = abc1 floorplanid = 123>
    <unitinfo>info</unitinfo>
<unit>
<unit id = abc2 floorplanid = 123>
    <unitinfo>info</unitinfo>
<unit>
<unit id = abc3 floorplanid = 456>
    <unitinfo>info</unitinfo>
 <unit>
 <unit id = abc4 floorplanid = 456>
    <unitinfo>info</unitinfo>
 <unit>

На основе значения идентификаторов плана этажа в единицах, я хочу отобразить их на планы этажей и получить xml формата ниже , Это возможно с помощью xslt и что может быть лучшим подходом. Я не уверен, что я объяснил в своем вопросе лучше, но пример должен это сделать.

<Floorplan IDValue="123" IDType="FloorplanID" IDRank="primary">
  <FloorplanInfo>info<FloorplanInfo>    
  <unit id = abc1 floorplanid = 123>
    <unitinfo>info</unitinfo>
   <unit>
  <unit id = abc2 floorplanid = 123>
     <unitinfo>info</unitinfo>
  <unit>
</Floorplan>
<Floorplan IDValue="456" IDType="FloorplanID" IDRank="primary">
        <FloorplanInfo>info<FloorplanInfo>
 <unit id = abc3 floorplanid = 456>
        <unitinfo>info</unitinfo>
 <unit>
 <unit id = abc4 floorplanid = 456>
        <unitinfo>info</unitinfo>
  <unit>    
 </Floorplan>

Заранее спасибо !!

1 Ответ

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

Это должно работать для вас. К вашему сведению: мне пришлось вычистить XML, который вы разместили, потому что он не был правильно сформирован.

    <xsl:key name="myKey" match="unit" use="@floorplanid"/>

    <xsl:template match="Floorplan">
      <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
        <xsl:apply-templates select="key('myKey', @IDValue)" mode="unitMode"/>
      </xsl:copy>
    </xsl:template>

    <!-- Suppress unit current nodes. -->
    <xsl:template match="unit"/>

    <!-- Use mode to add the new unit nodes.  -->
    <xsl:template match="unit" mode="unitMode">
      <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
      </xsl:copy>
    </xsl:template>

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