我试图转换1个xml文件(file1.xml)来更改它的标记,同时我希望通过比较"file1.xml“的@id是否等于"replace.xml”中的@id,将1标记(类别)上的值替换为来自另一个XML文件(replace.xml)的值。如果为true,则将file1.xml中的标记(类别)的值替换为来自"replace.xml“的值,但我不知道如何在1个XSLT文件中实现该值,因此我试图创建两个将转换的文件:
File1.xml
<?xml version="1.0"?>
<products>
<product>
<id_item>1002333</id_item>
<producer>XYZ</producer>
<price>
<delivery_cost>
<prepayment>000</prepayment>
<cash_on_delivery>000</cash_on_delivery>
</delivery_cost>
</price>
<category id="456" name="Gloves"></category>
</product>
<product>
<id_item>1002000</id_item>
<producer>XYZ</producer>
<price>
<delivery_cost>
<prepayment></prepayment>
<cash_on_delivery></cash_on_delivery>
</delivery_cost>
</price>
<category id="123" name="Shoes"></category>
</product>
</products>我用我的第一个XSL转换了上面的例子(我不能在这里包含这个文件,因为它太大了,我不知道如何做一个例子)
第一次转变的产出:
<?xml version="1.0"?>
<channel>
<PRODUCT>
<ID_ITEM>1002333</ID_ITEM>
<PRODUCER>XYZ</PRODUCER>
<PRICE_VAT>000</PRICE_VAT>
<CATEGORY id="456">Gloves</CATEGORY >
</PRODUCT>
<PRODUCT>
<ID_ITEM>1002000</ID_ITEM>
<PRODUCER>XYZ</PRODUCER>
<PRICE_VAT>000</PRICE_VAT>
<CATEGORY id="123">Shoes</CATEGORY >
</PRODUCT>
</channel>现在,我想使用这个XML文件(replace.xml)将输出的标签类别的文本值更改为from (replace.xml)
Replace.xml
<?xml version="1.0"?>
<ITEM>
<category id="456">ReplacedGloves</category>
<category id="123">ReplacedShoes</category>
<category id="321">REplaced1</category>
<category id="432">REplaced2</category>
</ITEM>第二个XSL文件
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:import href="firstXSLhere.xsl"/>
<xsl:variable name="plik_mapping" select="document('maptest.xml')"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="category">
<xsl:copy>
<xsl:apply-templates select="@*"/>
<xsl:choose>
<xsl:when test="$plik_mapping//category[@id=current()/@id]">
<xsl:apply-templates select="$plik_mapping//category[@id=current()/@id]/@name"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="@name"/>
</xsl:otherwise>
</xsl:choose>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>和最终输出
<?xml version="1.0"?>
<channel>
<PRODUCT>
<ID_ITEM>1002333</ID_ITEM>
<PRODUCER>XYZ</PRODUCER>
<PRICE_VAT>000</PRICE_VAT>
<CATEGORY id="456">ReplacedGloves</CATEGORY >
</PRODUCT>
<PRODUCT>
<ID_ITEM>1002000</ID_ITEM>
<PRODUCER>XYZ</PRODUCER>
<PRICE_VAT>000</PRICE_VAT>
<category id="123">ReplacedShoes</CATEGORY >
</PRODUCT>
</channel>我在这里试图做的是将第一个XSL文件导入第二个XSL文件,并将File1.xml转换为它的最终输出。但我不知道我在这里做错了什么。因为File1.xml只使用第一个XSL文件模板进行转换。我不确定我是否做错了进口优先顺序。
发布于 2021-12-23 14:23:43
正如我在the previous version of this question中告诉您的,您可能可以使用单个样式表完成整个转换。
由于您没有发布第一个XSLT,所以很难确切说明应该如何做到这一点。下面是一个简化的示例:
XSLT1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:param name="plik_mapping" select="document('maptest.xml')"/>
<xsl:template match="/products">
<channel>
<xsl:for-each select="product">
<PRODUCT>
<ID_ITEM>
<xsl:value-of select="id_item" />
</ID_ITEM>
<PRODUCER>
<xsl:value-of select="producer" />
</PRODUCER>
<PRICE_VAT>
<!-- ??? -->
</PRICE_VAT>
<xsl:variable name="cat" select="category" />
<xsl:variable name="replacement" select="$plik_mapping/ITEM/category[@id=$cat/@id]" />
<CATEGORY id="{$cat/@id}">
<xsl:choose>
<xsl:when test="$replacement">
<xsl:value-of select="$replacement" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$cat/@name" />
</xsl:otherwise>
</xsl:choose>
</CATEGORY>
</PRODUCT>
</xsl:for-each>
</channel>
</xsl:template>
</xsl:stylesheet>应用于输入的XML示例,这将产生:
结果
<?xml version="1.0"?>
<channel>
<PRODUCT>
<ID_ITEM>1002333</ID_ITEM>
<PRODUCER>XYZ</PRODUCER>
<PRICE_VAT/>
<CATEGORY id="456">ReplacedGloves</CATEGORY>
</PRODUCT>
<PRODUCT>
<ID_ITEM>1002000</ID_ITEM>
<PRODUCER>XYZ</PRODUCER>
<PRICE_VAT/>
<CATEGORY id="123">ReplacedShoes</CATEGORY>
</PRODUCT>
</channel>这与您显示的输出类似,除了PRICE_VAT的值之外,您没有向我们提供关于它应该如何派生的信息(当然还有category与CATEGORY的不匹配)。
https://stackoverflow.com/questions/70462115
复制相似问题