Xml 引用另一个子节点的XLST
我正在尝试添加引用另一个子节点的子节点。在下面的示例中,我想将Xml 引用另一个子节点的XLST,xml,xslt,Xml,Xslt,我正在尝试添加引用另一个子节点的子节点。在下面的示例中,我想将从填充到。我这样做是因为MS Access只将子节点导入到单独的表中,而没有引用/链接表的方法 <AcctFncl xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="fsrv" xsi:schemaLocation="fsrv Rec.xsd" Version="27"> <CreateDate>20151101</CreateD
从
填充到
。我这样做是因为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>
20151101
20151031
XXX
123980
5268
50
0
10
1.
应该是这样的:
<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>
20151101
20151031
XXX
123980
123980
5268
50
0
10
1.
我一直在尝试创建一个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>
我认为您遇到的主要问题是,您的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>
演示:我认为您遇到的主要问题是,您的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>
演示:对不起,应该是123980。我的错误。XML来自第三方系统,我正试图将其导入MS Access,并在导入时使用一个键链接两个子表。Access导入单独的表,但没有用于链接它们的公用键。对不起,应该是123980。我的错误。XML来自第三方系统,我正试图将其导入MS Access,并在导入时使用一个键链接两个子表。Access导入单独的表,但没有公共键来链接它们。这很有效!我不确定名称空间到底是如何工作的(或者它在XML文件中是如何使用的),现在就阅读它,以便更好地理解它。还感谢您向我展示了xlstransform.net网站,与我现在使用的记事本++相比,它也非常有用…@NOCARRIER-非常欢迎您+第一个问题很好。下面是一些关于名称空间的好资源:这很有效!我不确定名称空间到底是如何工作的(或者它在XML文件中是如何使用的),现在就阅读它,以便更好地理解它。还感谢您向我展示了xlstransform.net网站,与我现在使用的记事本++相比,它也非常有用…@NOCARRIER-非常欢迎您+第一个问题很好。以下是一些关于名称空间的好资源: