我想从xml文件中导入一些产品。我在尝试映射一些属性。问题是我想在我的网站上有特定的属性名称,例如"颜色,大小,直径,led温度";一种产品,另一种产品例如颜色,高度,材质其他产品
在xml中有成千上万的产品和许多许多类别。例如,一个产品有20个属性,另一个产品有10个属性,其中一些是常见的,但顺序不同。而且它们的名称和我在我的网站
中使用的名称不同我想要的是把一些特定的我需要的20和映射到我的属性,我说过有一个不同的名称,而不是在xml中。也许当我使用名称"material"在我的网站…在XML中,使用另一个词代替"material">
">有些属性有多个用逗号分隔的值我需要把这些值作为单独的对象
这是xml
<product>
<id>314</id>
<name>
<![CDATA[
InLight Κρεμαστό φωτιστικό από διάφανο γυαλί και κρύσταλλα 3XE14 D:55cm (5314-3-CLEAR)
]]>
</name>
<image>
<![CDATA[
https://www.moraitis.com/image/2019-2020/5314-3 DIAFANO.jpg
]]>
</image>
<additional_image>
<![CDATA[
https://www.moraitis.com/image/2019-2020/5314-3 GIALI SKITSO.jpg
]]>
</additional_image>
<code>5314-3-CLEAR</code>
<ean>314</ean>
<mpn>314</mpn>
<isbn/>
<rec_fee>0.3</rec_fee>
<price_without_vat>103.95</price_without_vat>
<price_with_vat>128.90</price_with_vat>
<manufacturer>
<![CDATA[ InLight ]]>
</manufacturer>
<url>
<![CDATA[
https://www.moraitis.com/Κρεμαστό φωτιστικό από διάφανο γυαλί και κρύσταλλα 3XE14 D:55cm (5314-3-CLEAR)
]]>
</url>
<url_non_seo>
<![CDATA[ https://www.moraitis.com/&path=209&product_id=314 ]]>
</url_non_seo>
<category>
<![CDATA[ Φωτιστικά ]]>
</category>
<category_id>
<![CDATA[ 209 ]]>
</category_id>
<category_id_path>
<![CDATA[ 209 ]]>
</category_id_path>
<cat_tree>
<cat>
<![CDATA[ Φωτιστικά ]]>
</cat>
<cat>
<![CDATA[ Φωτιστικά Οροφής ]]>
</cat>
<cat>
<![CDATA[ Κρεμαστά Φωτιστικά ]]>
</cat>
</cat_tree>
<weight>3.50</weight>
<weight_if_in_grams>4</weight_if_in_grams>
<weight_if_in_kg>3.50 kg</weight_if_in_kg>
<dimensions>
<length>42.00</length>
<width>36.00</width>
<height>23.00</height>
</dimensions>
<instock>Y</instock>
<availability>Παράδοση σε 4 - 10 ημέρες</availability>
<size/>
<shipping/>
<description>
<![CDATA[
Πρόκειται για ένα διάφανο γυάλινο κρεμαστό φωτιστικό με τρεις λαμπτήρες. Τόσο τα διάφανα κρύσταλλα που κρέμονται όσο και οι χρώμιο μεταλλικές λεπτομέρειες του προσδίδουν μια επιπλέον λάμψη. Η χρώμιο μεταλλική ανάρτηση είναι ρυθμιζόμενη και προσαρμόζεται στον κάθε χώρο.
]]>
</description>
<attributes>
<attr>
<name>
<![CDATA[ Dimmable ]]>
</name>
<text>
<![CDATA[ Ναι ]]>
</text>
</attr>
<attr>
<name>
<![CDATA[ Αριθμός Λαμπτήρων ]]>
</name>
<text>
<![CDATA[ 3 ]]>
</text>
</attr>
<attr>
<name>
Βαθμός Προστασίας
</name>
<text>
IP20
</text>
</attr>
<attr>
<name>
<![CDATA[ Λαμπτήρας ]]>
</name>
<text>
<![CDATA[ Ε14 ]]>
</text>
</attr>
<attr>
<name>
<![CDATA[ Με Λαμπτήρα ]]>
</name>
<text>
<![CDATA[ Όχι ]]>
</text>
</attr>
<attr>
<name>
<![CDATA[ Τοποθέτηση ]]>
</name>
<text>
<![CDATA[ Οροφή ]]>
</text>
</attr>
<attr>
<name>
<![CDATA[ Υλικό Κατασκευής ]]>
</name>
<text>
<![CDATA[ Γυαλί, Κρύσταλλα, Μέταλλο ]]>
</text>
</attr>
<attr>
<name>
<![CDATA[ Χρώμα Ανάρτησης ]]>
</name>
<text>
<![CDATA[ Χρώμιο ]]>
</text>
</attr>
<attr>
<name>
<![CDATA[ Χρώμα Γυαλιού ]]>
</name>
<text>
<![CDATA[ Διάφανο ]]>
</text>
</attr>
<attr>
<name>
<![CDATA[ Χρώμα Κρυστάλλου ]]>
</name>
<text>
<![CDATA[ Διάφανο ]]>
</text>
</attr>
</attributes>
</product>
到目前为止我做了两件事
- 我使用了这个xpath:
{(attr/text[../name/text()="Υλικό Κατασκευής"]/text())}
但是没有成功,它返回空
- 然后我使用了这个函数:
function my_get_attribute_value( $attr, $name, $value ) {
if ( empty( $name ) || empty( $value ) ) return;
$names = explode( ", ", $name[0] );
$values = explode( ", ", $value[0] );
foreach ( $names as $key => $v ) {
if ( $v == $attr && array_key_exists( $key, $values ) ) {
return $values[ $key ];
}
}
}
并使用xpath调用它:
[my_get_attribute_value("Χρώμα Ανάρτησης",array({attributes/attr/name}),array({attributes/attr/text}))]
对于我想映射的每个属性,我只需更改名称(希腊语)。这样做的问题是,当我有一个值与逗号分隔的文本,如"Γυαλί, Κρύσταλλα, Μέταλλο"它将这个添加到数组中当我调用属性时它只显示"Γυαλί"下一个属性不是显示它的值而是显示"Κρύσταλλα">
注意,XPath表达式中由text()
步骤标识的文本节点以"新行"开始和结束;的性格。例如
<example>
test
</example>
XPath表达式/example/text()='test'
将返回false
。
<example>test</example>
XPath表达式/example/text()='test'
将返回true
。
您可能喜欢使用normalize-space()
函数来删除多余的空白:
<example>
test
</example>
XPath表达式normalize-space(/example/text())='test'
将返回true
。
另外,当您将元素的内容与字符串值进行比较时,可以省略text()
步骤,而使用/example
这样的XPath,它将隐式地将元素转换为字符串。