【问题标题】:XLST referencing another child nodeXSLT 引用另一个子节点
【发布时间】:2017-12-02 04:37:53
【问题描述】:

我正在尝试添加一个引用另一个子节点的子节点。在下面的示例中,我想将<AcctID><AcctDtl> 填充到<Position>。我这样做是因为 MS-Access 仅将子节点导入单独的表中,而没有引用/链接表的方式。

<AcctFncl xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="fsrv" xsi:schemaLocation="fsrv Rec.xsd" Version="27">
  <CreateDate>20151101</CreateDate>
  <EffectDate>20151031</EffectDate>
  <FnclRec>
    <AcctDtl>
      <MgmtCode>XXX</MgmtCode>
      <AcctID>123980</AcctID>      
    </AcctDtl>
    <Position>
      <FundID>5268</FundID>
      <TotalUnAssigned>50</TotalUnAssigned>
      <TotalAssigned>0</TotalAssigned>
      <AveCost>10</AveCost>
      <DivOpt>1</DivOpt>
    </Position>
   </FnclRec>
</AcctFncl>

应该看起来像:

<AcctFncl xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="fsrv" xsi:schemaLocation="fsrv Rec.xsd" Version="27">
  <CreateDate>20151101</CreateDate>
  <EffectDate>20151031</EffectDate>
  <FnclRec>
    <AcctDtl>
      <MgmtCode>XXX</MgmtCode>
      <AcctID>123980</FundAcctID>      
    </AcctDtl>
    <Position>
      <AcctID>123980</AcctID>      
      <FundID>5268</FundID>
      <TotalUnAssigned>50</TotalUnAssigned>
      <TotalAssigned>0</TotalAssigned>
      <AveCost>10</AveCost>
      <DivOpt>1</DivOpt>
    </Position>
   </FnclRec>
</AcctFncl>

我一直在尝试创建一个 XSLT 来执行此操作,但我想我在这里过头了。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="Position">
        <FundPosition>
            <AcctID><xsl:value-of select="../AcctDtl/CreateDate"/></AcctID>         
            <xsl:apply-templates select="@*|node()"/>
        </FundPosition>
    </xsl:template>
</xsl:stylesheet>

【问题讨论】:

  • 抱歉,应该是 123980。我的错。 XML 来自第三方系统,我正在尝试将其导入 MS Access 并拥有一个在导入时链接两个子表的密钥。 Access 会导入单独的表,但没有用于链接它们的通用键。

标签: xml xslt


【解决方案1】:

我认为您遇到的主要问题是您的 XML 输入位于默认命名空间 fsrv 中,但您的 XSLT 无法处理它。

为了匹配 XSLT 中的这些元素,您必须将该命名空间绑定到一个前缀并在 XPath 中使用该前缀。

在下面的示例中,我使用了前缀“f”,但您可以使用其他前缀。

示例...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:f="fsrv">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

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

  <xsl:template match="f:Position">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()|../f:AcctDtl/f:AcctID"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

演示:http://xsltransform.net/bEJaofi

【讨论】:

  • 成功了!我不确定命名空间是如何工作的(或者它是如何在 XML 文件中使用的),现在阅读它以便我能更好地理解这一点。也感谢您向我展示 xlstransform.net 网站,与我现在使用的 Notepad++ 相比,它也非常有用...
  • @NOCARRIER - 不客气! +1 很好的第一个问题。这里有一些关于命名空间的好资源:jclark.com/xml/xmlns.htmstackoverflow.com/a/25830482/317052
猜你喜欢
  • 2019-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-11
  • 1970-01-01
  • 2017-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多