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>
我们收到来自客户的 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>