使用 XSLT 格式化 XML 导入文件到数据库



我正在尝试在将导入文件读入数据库之前对其进行转换。

.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>

相关内容

  • 没有找到相关文章

最新更新