XSLT - 提取一些带有子节点的元素 (.net XSLT 1.0)

XSLT - Extract some Elements with subnodes (.net XSLT 1.0)

我遇到了一些麻烦,无法从 XML-Document 中仅提取几个节点。 在我的例子中,我只得到我的子节点的 "value" 而不是节点及其子节点本身。 我正在使用 .net 3.5 c# 转换文档 (XslCompiledTransform.Transform)。

示例XML(来源)

<?xml version="1.0" encoding="utf-8"?>
<Response xmlns="http://www.k-5.at/publicservices/download/MassenDatenResponseHaushalt:001"> 
    <Header>
        <PaketType>Household</PaketType>
        <ClientUid>6d513eae-b17f-4c30-b1eb-036ef36c5e8c</ClientUid>
        <ClientName>DEMO</ClientName>
        <UserLoginName>DEMO1</UserLoginName>
        <UserDisplayName>Demo1 User</UserDisplayName>
        <PointOfTime>2015-02-19T10:37:11.0768481+01:00</PointOfTime>
    </Header>
    <HeaderHousehold>
        <CustomerNumber>70716</CustomerNumber>
    </HeaderHousehold>
    <DataHouseHold>
        <Years>
            <YearData>
                <Year>2015</Year>
            </YearData>    
        </Years>
    </DataHouseHold>
    <DataDebts>
        <Years>
            <YearData>
                <Year>2015</Year>
            </YearData>
        </Years>
    </DataDebts>
</Response>

我想实现的是 select "Repsonse/Header-Node" 及其子节点的输出(稍后还有一些其他节点)- 但我想保留结构。

我的 xslt:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
                    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                    xmlns="http://www.k-5.at/publicservices/download/MassenDatenResponseHaushalt:001"               
                    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="/">
        <xsl:element name= "Response">
            <xsl:element name= "Header">
                <xsl:copy-of select = "/Response/Header/node()"/>        
                <xsl:apply-templates/>
            </xsl:element>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

我得到的结果: (我只得到 "Header" 节点作为值...)

<Response>
    <Header>Household6d513eae-b17f-4c30-b1eb-036ef36c5e8cDEMORDEMO1Demo1 User2015-02-19T10:37:11.0768481+01:007071620152015</Header>
</Response>

结果应该是这样的:

<Response> 
    <Header>
        <PaketType>Household</PaketType>
        <ClientUid>6d513eae-b17f-4c30-b1eb-036ef36c5e8c</ClientUid>
        <ClientName>DEMO</ClientName>
        <UserLoginName>DEMO1</UserLoginName>
        <UserDisplayName>Demo1 User</UserDisplayName>
        <PointOfTime>2015-02-19T10:37:11.0768481+01:00</PointOfTime>
    </Header>
</Response> 

我希望有人能帮助我。

非常感谢!

编辑

我的 C# 代码片段:

XPathDocument myXPathDoc = new XPathDocument(xml);
                XslCompiledTransform myXslTrans = new XslCompiledTransform();

                myXslTrans.Load(xslt);

                if (System.IO.File.Exists("result.xml"))
                    System.IO.File.Delete("result.xml");

                XmlTextWriter myWriter = new XmlTextWriter("result.xml", null);
                myWriter.Formatting = Formatting.Indented;
                myXslTrans.Transform(myXPathDoc, null, myWriter);

                myWriter.Close();
  1. 您向我们展示的结果不是应用您的代码时收到的结果。

  2. 如果删除第 11 行,您将得到所需的结果:

    <xsl:apply-templates/>

当你这样做的时候,你可以将整个事情简化为:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">               
<xsl:output method="xml" indent="yes"/>

<xsl:template match="/Response">
    <Response>
        <xsl:copy-of select="Header"/>        
    </Response>
</xsl:template>

</xsl:stylesheet>

编辑

为了响应您编辑的输入,将整个响应放入命名空间中:

如评论中所述,您不能在不复制元素名称空间的情况下复制元素。如果您希望输出不在命名空间中,则需要为每个 "old" 创建一个新元素。在对源文档中的元素进行寻址时,您还必须使用前缀:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:k5="http://www.k-5.at/publicservices/download/MassenDatenResponseHaushalt:001"
exclude-result-prefixes="k5">               
<xsl:output method="xml" indent="yes"/>

<xsl:template match="/k5:Response">
    <Response>
        <xsl:apply-templates select="k5:Header"/>        
    </Response>
</xsl:template>

<xsl:template match="*">
    <xsl:element name="{local-name()}">
        <xsl:apply-templates/>        
    </xsl:element>
</xsl:template>

</xsl:stylesheet>