我正在尝试在将导入文件读入数据库之前对其进行转换。
.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
,但由于多种原因他们无法做到这一点。
有谁知道我如何实现这一目标?任何帮助将不胜感激。
您可以使用"全局"变量和//
表达式来执行此操作:
从当前节点中选择文档中与所选内容匹配的节点,无论它们位于何处
所以在样式表级别创建一个变量
<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>