XSLT 模板匹配属性并将此属性用作节点名称

XSLT template match on attribute and use this attribute as node name

我们收到来自客户的 XML,其中包含产品 ID 是节点中的一个属性。

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <product Q="23">
        <id>27</id>
        <id_name>Product1</id_name>
        <description>Vegetables</description>
    </product>
    <product Q="38">
        <id>39</id>
        <id_name>Product2</id_name>
        <description>Dairy</description>
    </product>
    <product Q="59">
        <id>37</id>
        <id_name>Product3</id_name>
        <description>Bread</description>
    </product>
</root>       

我想做的是使用这个属性作为节点名。 输出会像这样

<?xml version="1.0" encoding="UTF-8"?>
    <root>
    <Q23>
        <id>27</id>
        <id_name>Product1</id_name>
        <description>Vegetables</description>
    </Q23>
    <Q38>
        <id>39</id>
        <id_name>Product2</id_name>
        <description>Dairy</description>
    </Q38>
    <Q59>
        <id>37</id>
        <id_name>Product3</id_name>
        <description>Bread</description>
    </Q59>
</root>    

我可以将 XSL 获取到 select 正确的节点和属性,但它目前没有产生所需的输出。

<xsl:template match="finishing/@Q[.='23']">
<Q23>
            <xsl:copy>
                <xsl:copy-of select="../../id,  ../../id_name, ../../description,*"/>
            </xsl:copy>
</Q23>
</xsl:template>    

输出:

<product>
       <Q23 Q="23"/>
          <id>27</id>
          <id_name>Product1</id_name>
          <description>Vegetables</description>
    </product>      

我确定完成起来应该相对简单,但不确定使用模板匹配是否是正确的方法。

您可以轻松匹配 product 并使用 <xsl:element name="Q{@Q}"><xsl:apply-templates/></xsl:element> 创建新元素,例如

<xsl:template match="product">
  <xsl:element name="Q{@Q}">
    <xsl:apply-templates/>
  </xsl:element>
</xsl:template>

并让身份模板处理其他复制

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