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