【问题标题】:xml create attribute with dynamic value using xsltxml使用xslt创建具有动态值的属性
【发布时间】:2018-08-15 10:36:01
【问题描述】:

我有以下 XML。我需要向第一个“实体”节点添加一个属性。此属性应具有来自属性节点“A-AssetFileName”的值。数据/实体中有多个实体节点。

<?xml version="1.0" encoding="UTF-8"?>
<Entity Id="347" ExternalId="SSI1006" LongName="School Smart Hand Held Rustproof Carbon Steel Pencil Sharpener, Assorted Color, Pack of 24" EntityTypeId="18" EntityTypeName="Parent SKU" ContainerId="2" ContainerName="Collaboration Master" OrganizationName="DL" CategoryId="360" CategoryName="Sharpners" CategoryLongName="Sharpners" CategoryPath="SchoolSupplies»School_Office_Supplies»Sharpners" CategoryLongNamePath="" ParentEntityId="360" ParentExternalId="Sharpners" ParentExtensionEntityId="0" ParentExtensionEntityExternalId="" ParentExtensionEntityContainerId="0" ParentExtensionEntityContainerName="" ParentExtensionEntityCategoryId="0" ParentExtensionEntityCategoryPath="" ParentExtensionEntityCategoryLongNamePath="" Locale="en_WW" Action="Add">
<Attributes>
    <Attribute Id="4039" Name="Parent SKU #" LongName="Product Number" InstanceRefId="-1" Sequence="-1" AttributeParentId="4000" AttributeParentName="Core Attribute Group" AttributeType="Simple" AttributeDataType="String" Locale="en_WW" Action="Add">
        <Values>
            <Value Id="0" Uom="" ValueRefId="-1" Sequence="-1" DisplayValue="" HasInvalidValue="False" Locale="en_WW" Action="Add">
                <![CDATA[9-07466-030]]>
            </Value>
        </Values>
    </Attribute>
    <Attribute Id="4040" Name="Product Name" LongName="Product Name" InstanceRefId="-1" Sequence="-1" AttributeParentId="4000" AttributeParentName="Core Attribute Group" AttributeType="Simple" AttributeDataType="String" Locale="en_WW" Action="Add">
        <Values>
            <Value Id="0" Uom="" ValueRefId="-1" Sequence="-1" DisplayValue="" HasInvalidValue="False" Locale="en_WW" Action="Add">
                <![CDATA[School Smart Hand Held Rustproof Carbon Steel Pencil Sharpener]]>
            </Value>
        </Values>
    </Attribute>
   <Attribute Id="4122" Name="A-Assets" LongName="Assets" InstanceRefId="-1" Sequence="-1" AttributeParentId="4003" AttributeParentName="Media Attribute Group" AttributeType="ComplexCollection" AttributeDataType="String" Locale="en_WW" Action="Add">
        <Attributes>
            <Attribute Id="4122" Name="A-Assets Instance Record" LongName="Assets Instance Record" InstanceRefId="293" Sequence="0" AttributeParentId="4003" AttributeParentName="Media Attribute Group" AttributeType="Complex" AttributeDataType="String" Locale="en_WW" Action="Add">
                <Attributes>
                    <Attribute Id="4126" Name="A-AssetDescription" LongName="AssetDescription" InstanceRefId="-1" Sequence="-1" AttributeParentId="4122" AttributeParentName="A-Assets" AttributeType="Simple" AttributeDataType="String" Locale="en_WW" Action="Add">
                        <Values>
                            <Value Id="-1" Uom="" ValueRefId="0" Sequence="-1" DisplayValue="" HasInvalidValue="False" Locale="en_WW" Action="Add" />
                        </Values>
                    </Attribute>
                    <Attribute Id="4127" Name="A-AssetDisplayName" LongName="AssetDisplayName" InstanceRefId="-1" Sequence="-1" AttributeParentId="4122" AttributeParentName="A-Assets" AttributeType="Simple" AttributeDataType="String" Locale="en_WW" Action="Add">
                        <Values>
                            <Value Id="-1" Uom="" ValueRefId="0" Sequence="-1" DisplayValue="" HasInvalidValue="False" Locale="en_WW" Action="Add" />
                        </Values>
                    </Attribute>
                    <Attribute Id="4128" Name="A-AssetFileName" LongName="AssetFileName" InstanceRefId="-1" Sequence="-1" AttributeParentId="4122" AttributeParentName="A-Assets" AttributeType="Simple" AttributeDataType="String" Locale="en_WW" Action="Add">
                        <Values>
                            <Value Id="-1" Uom="" ValueRefId="0" Sequence="-1" DisplayValue="" HasInvalidValue="False" Locale="en_WW" Action="Add">
                                <![CDATA[SSI1006_SchoolSmart Sharpener_1.jpg]]>
                            </Value>
                        </Values>
                    </Attribute>
                    <Attribute Id="4129" Name="A-AssetID" LongName="AssetID" InstanceRefId="-1" Sequence="-1" AttributeParentId="4122" AttributeParentName="A-Assets" AttributeType="Simple" AttributeDataType="String" Locale="en_WW" Action="Add">
                        <Values>
                            <Value Id="-1" Uom="" ValueRefId="0" Sequence="-1" DisplayValue="" HasInvalidValue="False" Locale="en_WW" Action="Add">
                                <![CDATA[991E8697FD394A17A70C0DA7A73ECE87]]>
                            </Value>
                        </Values>
                    </Attribute>
                </Attributes>
            </Attribute>
        </Attributes>
    </Attribute>
</Attributes>
<Relationships />

【问题讨论】:

标签: xml xslt


【解决方案1】:

需要对匹配&lt;Entity&gt; 的模板进行一些更改。

您提到该属性只需要包含在第一个&lt;Entity&gt; 节点中。在这种情况下,匹配的模板看起来像

<xsl:template match="Entity[1]">

@Name属性选择值时,该值应该用单引号引起来',另外XPath需要修改如下。

<xsl:value-of select="//Attribute[@Name = 'A-AssetFileName']/Values/Value" />

最后,在应用其他模板时,需要应用所有的节点和属性,否则属性将不会应用。

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

所以模板看起来像

<xsl:template match="Entity[1]">
    <xsl:copy>
        <xsl:attribute name='ProductImage'> 
            <xsl:value-of select="//Attribute[@Name = 'A-AssetFileName']/Values/Value" />
        </xsl:attribute>
        <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
</xsl:template>

【讨论】:

    猜你喜欢
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-05
    • 1970-01-01
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多