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

时间:2017-08-04 17:41:44

标签: xml xslt-1.0

我正在尝试转换导入文件,然后再将其读入我的数据库。

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,但由于几个原因他们无法做到这一点。

有谁知道我怎么能做到这一点?非常感谢任何帮助。

1 个答案:

答案 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>