将数据从一个XML文件添加到另一个XML文件 - PHP

时间:2016-12-09 09:03:43

标签: php xml xslt scripting

任何帮助将不胜感激。我希望从一个XML文件中获取一个值,并使用PHP将其输入到另一个XML中。如果他们有效,我会接受任何其他转型方法。

XML 1

<field-list>
<field Id="spMF_1_1634">
    <tag>Customer Name</tag>
    <type>string</type>
    <required>true</required>
    <value>1Test</value>
</field>
<field Id="spMF_2_1634">
    <tag>Job Reference</tag>
    <type>string</type>
    <required>false</required>
    <value>42442</value>
</field>

XML 2

<Log>
  <DataSource>Data_source</DataSource>
  <SQLStatement>SELECT TotalPrice FROM vwQuotations WHERE reference = 'REF42442'</SQLStatement>
  <SQLStatementResult>Success</SQLStatementResult>
  <SQLStatementValue>
    <Row>
      <Column Name="TotalPrice" DataType="REAL">2000</Column>
    </Row>
  </SQLStatementValue>
</Log>

输出/结果我正在寻找:

<field-list>
<field Id="spMF_1_1634">
    <tag>Customer Name</tag>
    <type>string</type>
    <required>true</required>
    <value>1Test</value>
</field>
<field Id="spMF_2_1634">
    <tag>Job Reference</tag>
    <type>string</type>
    <required>false</required>
    <value>42442</value>
</field>
<field Id="AnyID">
    <tag>TotalPrice</tag>
    <type>string</type>
    <required>false</required>
    <value>2000</value>
</field>

第三个字段(2000)的值实际上是我需要添加到第一个XML中的。

正如您所看到的,两种XML格式不同。 我希望我已经清楚地解释了自己。

总结一下,我希望在XML 1中添加一个额外字段,其中子属性与XML 2中的2000匹配,并按照我的输出示例以与XML 1相同的格式输出。

谢谢。

****** ****** EDIT

我正在使用自动化软件来处理这些文件,所以遗憾的是我无法将参数传递给XML。

我正在从PDF(XML 1)中删除XML,我可以通过XSLT转换模块将其传递给CSV。

XML 2是从数据库中提取的,可以保存在静态文件夹中。

请参见下面带注释的屏幕截图。

我可以将XML 2文件路径硬编码到XLT转换中以插入数据吗?

enter image description here

1 个答案:

答案 0 :(得分:2)

您可以告诉处理器处理第一个XML并将路径作为参数传递给第二个XML。然后使用样式表:

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:param name="path-to-file2"/>

<!-- identity transform -->
<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="field-list">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
        <field Id="AnyID">
            <tag>TotalPrice</tag>
            <type>string</type>
            <required>false</required>
            <value>
                <xsl:value-of select="document($path-to-file2)/Log/SQLStatementValue/Row/Column"/>
            </value>
        </field>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>