我正在尝试转换导入文件,然后再将其读入我的数据库。
XML:
<?xml version="1.0" encoding="UTF-8"?>
<Import>
<Lines>
<Line>
<TransactionId>1</TransactionId>
<Sequence>1</Sequence>
<ItemCategoryId>1</ItemCategoryId>
</Line>
<Line>
<TransactionId>1</TransactionId>
<Sequence>0</Sequence>
<ItemId>0</ItemId>
</Line>
</Lines>
</Import>
XSLT:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:output method="xml" indent="yes"/>
<!-- matches on each author -->
<xsl:template match="Line">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
<OrderId>
<xsl:choose>
<xsl:when test="Sequence > 0 or ItemId > 0 ">
<xsl:value-of select="'1'"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="'0'"/>
</xsl:otherwise>
</xsl:choose>
</OrderId>
</xsl:copy>
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
结果:
<?xml version="1.0" encoding="UTF-8"?>
<Import>
<Lines>
<Line>
<TransactionId>1</TransactionId>
<Sequence>1</Sequence>
<ItemCategoryId>1</ItemCategoryId>
<OrderId>1</OrderId>
</Line>
<Line>
<TransactionId>1</TransactionId>
<Sequence>0</Sequence>
<ItemId>0</ItemId>
<OrderId>0</OrderId>
</Line>
</Lines>
</Import>
这适用于插入每个具有正确OrderId
值的行,但我真正想做的是以下内容:
如果其中一个行OrderId
值设置为1,我希望每行中的所有OrderId
都设置为1.
我需要这样做,因为OrderId
实际上存储在我的数据库中的订单级别,但是在行级别导入。由于我将按顺序获得不同的值ItemId
,所以当我真正希望它为1时,我会在某个时候将其设置为0.
通常我会让第三方在xml中向我发送正确且相同的OrderId
,但由于几个原因他们无法做到这一点。
有谁知道我怎么能做到这一点?非常感谢任何帮助。
答案 0 :(得分:0)
您可以使用全球&#39;变量和//
表达式
从当前节点中选择与选择匹配的文档中的节点,无论它们位于何处
所以在样式表级别创建一个变量
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:output method="xml" indent="yes"/>
<xsl:variable name="orderby" select="//Line/Sequence > 0 or //Line/ItemId > 0" />
...
并在OrderId
代码
<OrderId>
<xsl:choose>
<xsl:when test="$orderby">
<xsl:value-of select="'1'"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="'0'"/>
</xsl:otherwise>
</xsl:choose>
</OrderId>