【问题标题】:Adding data from one XML file to another - PHP将数据从一个 XML 文件添加到另一个 - PHP
【发布时间】:2016-12-09 09:03:43
【问题描述】:

对此的任何帮助将不胜感激。我希望从一个 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 相同的格式输出。

谢谢。

******编辑******

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

我将 XML 从 PDF (XML 1) 中剥离出来,然后我可以通过 XSLT 转换模块将其导出为 CSV。

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

请看下面带有注释的截图。

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

【问题讨论】:

  • 请创建一个Minimal, Complete, and Verifiable php 代码。你已经尝试了什么?我们会更容易为您提供帮助。
  • 嗨,Alexandre,抱歉,我不能为你创建 php 代码,因为我不熟悉 PHP。我过去刚刚编辑了 php 代码来执行此类任务,我知道我可以根据我的编辑将它与我正在使用的软件一起使用。我已经尝试过各种“软件内”尝试来执行此任务,但是在这里不值得一提。下面的 michael.hor257k 与他的 XSLT 非常接近,但是我无法从 XML2 中提取值。

标签: php xml xslt scripting


【解决方案1】:

您可以告诉您的处理器处理第一个 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>

【讨论】:

  • 嗨,迈克尔,感谢您的回复。这看起来很有希望,但是我唯一的障碍是我不能将参数传递给 XSL。我在我的帖子中添加了一个编辑来解释。是否可以对 XML2 路径进行硬编码?
  • 我已经尝试过你的公式并收到了一些结果。 XSLT 将字段添加到 XML1 文件,但它没有添加值,并且似乎缺少它的开始标记。我假设这是因为我试图对 XML2 文件路径进行硬编码。你能找到我出错的地方吗?我对您的代码的编辑: 结果添加到 XML1:TotalPricestringfalse
  • 是的,路径可以硬编码。但是,路径是一个字符串,它需要被引用。或者 - 最好 - 将其用作文字:&lt;xsl:param name="path-to-file2"&gt;/Users/universalgraphics/Desktop/CSV/XML Merge/42442.xml&lt;/xsl:param&gt;.
  • 请注意,路径可以是绝对或相对于样式表(或 XML 源,如果您指定的话)。
  • 我已经尝试过了,但是我似乎仍然得到相同的结果,但我无法弄清楚。这是我在输出 XML 中得到的内容。 TotalPricestringfalse 抱歉,我似乎不知道如何格式化它在这里,但它只输出 字段的关闭。
猜你喜欢
  • 2012-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多