【问题标题】:How to get child nodes inside a parent node using xslt如何使用 xslt 在父节点中获取子节点
【发布时间】:2018-04-19 00:59:54
【问题描述】:

我有一个格式为

的xml
<ModelAttrib>
    <ModelAttribData>
        <ID>5</ID>
        <AttributeID>1</AttributeID>
    </ModelAttribData>
    <Attribute>
        <AttributeData>
            <ID>1</ID>
            <AttribVariation>
                <AttribVariationData>
                    <ID>2</ID>
                    <AttributeID>1</AttributeID>
                    <ModelAttribVar>
                        <ModelAttribVarData>
                            <ID>3</ID>
                            <AttribVariationID>2</AttribVariation>
                        </ModelAttribVarData>
                    </ModelAttribVar>   
                </AttribVariationData>
            </AttribVariation>
            <AttribVariation>
                <AttribVariationData>
                    <ID>9</ID>
                    <AttributeID>1</AttributeID>
                    <ModelAttribVar>
                        <ModelAttribVarData>
                            <ID>10</ID>
                            <AttribVariationID>9</AttribVariation>
                        </ModelAttribVarData>
                    </ModelAttribVar>   
                </AttribVariationData>
            </AttribVariation>              
        </AttributeData>
    </Attribute>
</ModelAttrib>  

我想把它转换成

<FeatureProduct>
    <ID>1</ID>
    <FeatureOptProduct>
        <ID>3</ID>
    </FeatureOptProduct>
    <FeatureOptProduct>
        <ID>9</ID>
    </FeatureOptProduct>
</FeatureProduct>

基本上,FeatureProduct 节点映射到 Attribute,而 FeatureOptProduct 映射到 AttribVariation。而且我有多个这样的 ModelAttrib 节点,我想将它映射到第二种 xml 格式。 到目前为止,我的代码看起来像这样

  <xsl:template match = "/">
    <PolicyProduct>
      <ProductCode>
        <xsl:value-of select = "//ProdModelData/Code"/>
      </ProductCode>
      <PlanName>
        <xsl:value-of select = "//ProdModelData/Description"/>
      </PlanName>
      <LineOfBusiness>Annuity</LineOfBusiness>
      <AnnuityProduct>
        <xsl:for-each select= "//ModelAttrib/Attribute/AttributeData">
              <FeatureProduct>
                <ID>
                  <xsl:value-of select="ID" />
                </ID>
                <Name>
                  <xsl:value-of select="Description"/>
                </Name>
              </FeatureProduct>
            </xsl:for-each>
      </AnnuityProduct>
    </PolicyProduct>
  </xsl:template>

但是我被困在如何以

的形式获取属性标签下的所有属性
<FeatureProduct>
 <FeatureOptProduct>
   <ID></ID>
 </FeaturOptProduct>
 <FeatureOptProduct>
   <ID></ID>
 </FeatureOptProduct>
</FeatureOptProduct>

【问题讨论】:

    标签: xslt xslt-2.0


    【解决方案1】:

    您需要在

    中添加一个嵌套的 &lt;xsl:for-each&gt; 循环
    <xsl:for-each select= "//ModelAttrib/Attribute/AttributeData">
    

    循环。内部循环遍历所有 &lt;AttribVariation&gt; 节点。

    <xsl:for-each select="//ModelAttrib/Attribute/AttributeData">
        <FeatureProduct>
            <ID><xsl:value-of select="ID" /></ID>
            <Name><xsl:value-of select="Description" /></Name>
            <xsl:for-each select="AttribVariation"> <!-- inner loop -->
                <FeatureOptProduct>
                    <ID><xsl:value-of select="AttribVariationData/ID" /></ID>
                </FeatureOptProduct>
            </xsl:for-each>
        </FeatureProduct>
    </xsl:for-each>
    

    此循环将产生以下输出

    <AnnuityProduct>
      <FeatureProduct>
         <ID>1</ID>
         <Name/>
         <FeatureOptProduct>
            <ID>2</ID>
         </FeatureOptProduct>
         <FeatureOptProduct>
            <ID>9</ID>
         </FeatureOptProduct>
      </FeatureProduct>
    </AnnuityProduct>
    

    但是,根据所需的输出,您需要 3 和 9 作为 &lt;ID&gt; 的 &lt;FeatureOptProduct&gt;。不确定这是否是一个错字,但这种组合确实位于&lt;AttribVariation&gt; 的子节点的相同 XPath 上。您可能需要根据 FeatureOptProduct/ID 的所需值更改 XPath。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多