XLST引用另一个子节点

时间:2017-12-01 20:05:12

标签: xml xslt

我正在尝试添加引用另一个子节点的子节点。在下面的示例中,我想将<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>

1 个答案:

答案 0 :(得分:0)

我认为您遇到的主要问题是您的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