此XSLT`<;的正确选择属性是什么;xsl:apply templates>;`标签

此XSLT`<;的正确选择属性是什么;xsl:apply templates>;`标签,xslt,apply-templates,Xslt,Apply Templates,我正在使用xslt呈现对json的soap响应。我无法控制soap服务 我可以使用来处理几个元素,但其中一个模板无法工作。我使用让它工作 源XML <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Header> <ActivityId CorrelationId="be49966e-745e-4701-902e-abcde759ecc6" xmlns="http://sc

我正在使用xslt呈现对json的soap响应。我无法控制soap服务

我可以使用
来处理几个元素,但其中一个模板无法工作。我使用
让它工作

源XML

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
    <ActivityId CorrelationId="be49966e-745e-4701-902e-abcde759ecc6" xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics">89528cc1-ab87-4abf-b485-2f38a995ee54</ActivityId>
</s:Header>
<s:Body>
    <SearchDocumentsResponse xmlns="http://tempuri.org/">
        <SearchDocumentsResult xmlns:a="http://schemas.datacontract.org/2004/07/Flairdocs.Framework.DocumentManagement" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
            <a:StoredDocumentEntity>
                <a:CreatedBy>Data Migration Tool</a:CreatedBy>
                <a:CreatedDate>2014-01-16T00:00:00</a:CreatedDate>
                <a:Description/>
                <a:DocumentType>File SummaryCard (136)</a:DocumentType>
                <a:DocumentTypeSystemName>136_File Summary Card</a:DocumentTypeSystemName>
                <a:EntityAssociations xmlns:b="http://schemas.datacontract.org/2004/07/Flairdocs.Data.Models.Contracts.Data"/>
                <a:GenerationTemplateSystemName i:nil="true"/>
                <a:IsLink>false</a:IsLink>
                <a:LinkText i:nil="true"/>
                <a:ModifiedBy i:nil="true"/>
                <a:ModifiedDate>2014-01-16T00:00:00</a:ModifiedDate>
                <a:SummaryMetadata>
                    <a:DocumentMetaDataEntry>
                        <a:AttributeName>File #</a:AttributeName>
                        <a:DisplayInUi>false</a:DisplayInUi>
                        <a:DocumentMetaDataAttributeId>0</a:DocumentMetaDataAttributeId>
                        <a:MultiValueSeperator i:nil="true"/>
                        <a:SystemName>FileNumber</a:SystemName>
                        <a:Value>H0782-10014</a:Value>
                    </a:DocumentMetaDataEntry>
                    <a:DocumentMetaDataEntry>
                        <a:AttributeName>RW Process</a:AttributeName>
                        <a:DisplayInUi>false</a:DisplayInUi>
                        <a:DocumentMetaDataAttributeId>0</a:DocumentMetaDataAttributeId>
                        <a:MultiValueSeperator i:nil="true"/>
                        <a:SystemName>RWProcess</a:SystemName>
                        <a:Value>File Administration</a:Value>
                    </a:DocumentMetaDataEntry>
                    <a:DocumentMetaDataEntry>
                        <a:AttributeName>RW Project #</a:AttributeName>
                        <a:DisplayInUi>false</a:DisplayInUi>
                        <a:DocumentMetaDataAttributeId>0</a:DocumentMetaDataAttributeId>
                        <a:MultiValueSeperator i:nil="true"/>
                        <a:SystemName>RWProjectNumber</a:SystemName>
                        <a:Value>H0782</a:Value>
                    </a:DocumentMetaDataEntry>
                </a:SummaryMetadata>
                <a:Title>H0782-10014 - File Summary Card</a:Title>
                <a:VersionCount>1</a:VersionCount>
            </a:StoredDocumentEntity>
            <a:StoredDocumentEntity>
                <a:CreatedBy>Data Migration Tool</a:CreatedBy>
                <a:CreatedDate>2014-01-16T00:00:00</a:CreatedDate>
                <a:Description/>
                <a:DocumentType>File SummaryCard (136)</a:DocumentType>
                <a:DocumentTypeSystemName>136_File Summary Card</a:DocumentTypeSystemName>
                <a:EntityAssociations xmlns:b="http://schemas.datacontract.org/2004/07/Flairdocs.Data.Models.Contracts.Data"/>
                <a:GenerationTemplateSystemName i:nil="true"/>
                <a:IsLink>false</a:IsLink>
                <a:LinkText i:nil="true"/>
                <a:ModifiedBy i:nil="true"/>
                <a:ModifiedDate>2014-01-16T00:00:00</a:ModifiedDate>
                <a:SummaryMetadata>
                    <a:DocumentMetaDataEntry>
                        <a:AttributeName>File #</a:AttributeName>
                        <a:DisplayInUi>false</a:DisplayInUi>
                        <a:DocumentMetaDataAttributeId>0</a:DocumentMetaDataAttributeId>
                        <a:MultiValueSeperator i:nil="true"/>
                        <a:SystemName>FileNumber</a:SystemName>
                        <a:Value>H0782-10014</a:Value>
                    </a:DocumentMetaDataEntry>
                    <a:DocumentMetaDataEntry>
                        <a:AttributeName>RW Process</a:AttributeName>
                        <a:DisplayInUi>false</a:DisplayInUi>
                        <a:DocumentMetaDataAttributeId>0</a:DocumentMetaDataAttributeId>
                        <a:MultiValueSeperator i:nil="true"/>
                        <a:SystemName>RWProcess</a:SystemName>
                        <a:Value>File Administration</a:Value>
                    </a:DocumentMetaDataEntry>
                    <a:DocumentMetaDataEntry>
                        <a:AttributeName>RW Project #</a:AttributeName>
                        <a:DisplayInUi>false</a:DisplayInUi>
                        <a:DocumentMetaDataAttributeId>0</a:DocumentMetaDataAttributeId>
                        <a:MultiValueSeperator i:nil="true"/>
                        <a:SystemName>RWProjectNumber</a:SystemName>
                        <a:Value>H0782</a:Value>
                    </a:DocumentMetaDataEntry>
                </a:SummaryMetadata>
                <a:Title>H0782-10014 - File Summary Card</a:Title>
                <a:VersionCount>1</a:VersionCount>
            </a:StoredDocumentEntity>
        </SearchDocumentsResult>
    </SearchDocumentsResponse>
</s:Body>
</s:Envelope>
下面的XSLT满足了我的需要,但我想简化它,删除第二个
(如果可能,还有第一个!)

工作XSLT

<?xml version="1.0"?>
<xsl:stylesheet xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://tempuri.org/" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:a="http://schemas.datacontract.org/2004/07/Flairdocs.Framework.DocumentManagement" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:b="http://schemas.datacontract.org/2004/07/Flairdocs.Data.Models.Contracts.Data" version="1.0">
<xsl:output method="text"/>

<xsl:template match="s:Header">
</xsl:template>

<xsl:template match="a:StoredDocumentEntity">
    <xsl:text>{</xsl:text>
        <xsl:for-each select="*[not(self::a:SummaryMetadata)]">
            <xsl:text>"</xsl:text>
            <xsl:value-of select="local-name()"/>
            <xsl:text>":"</xsl:text>
            <xsl:value-of select="normalize-space(.)"/>
            <xsl:text>",</xsl:text>
        </xsl:for-each>
        <xsl:for-each select="a:SummaryMetadata/a:DocumentMetaDataEntry">
            <xsl:text>"</xsl:text>
            <xsl:value-of select="a:SystemName"/>
            <xsl:text>":"</xsl:text>
            <xsl:value-of select="a:Value"/>
            <xsl:text>"</xsl:text>
            <xsl:if test="following-sibling::*">
                <xsl:text>,</xsl:text>
            </xsl:if>
        </xsl:for-each>         
    <xsl:text>}</xsl:text>
    <xsl:if test="following-sibling::*">
        <xsl:text>,</xsl:text>
    </xsl:if>
</xsl:template>

<xsl:template match="s:Envelope">
    <xsl:text>[</xsl:text>
        <xsl:apply-templates select="@*|node()" />
    <xsl:text>]</xsl:text>
</xsl:template> 
</xsl:stylesheet>
<?xml version="1.0"?>
<xsl:stylesheet xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://tempuri.org/" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:a="http://schemas.datacontract.org/2004/07/Flairdocs.Framework.DocumentManagement" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:b="http://schemas.datacontract.org/2004/07/Flairdocs.Data.Models.Contracts.Data" version="1.0">
<xsl:output method="text"/>

<xsl:template match="s:Header">
</xsl:template>

<xsl:template match="a:DocumentMetaDataEntry">
    <xsl:text>"</xsl:text>
    <xsl:value-of select="a:SystemName"/>
    <xsl:text>":"</xsl:text>
    <xsl:value-of select="a:Value"/>
    <xsl:text>"</xsl:text>
    <xsl:if test="following-sibling::*">
        <xsl:text>,</xsl:text>
    </xsl:if>
</xsl:template>

<xsl:template match="a:StoredDocumentEntity">
    <xsl:text>{</xsl:text>
        <xsl:for-each select="*[not(self::a:SummaryMetadata)]">
            <xsl:text>"</xsl:text>
            <xsl:value-of select="local-name()"/>
            <xsl:text>":"</xsl:text>
            <xsl:value-of select="normalize-space(.)"/>
            <xsl:text>",</xsl:text>
        </xsl:for-each>
        <xsl:apply-templates select="./a:DocumentMetaDataEntry" />
    <xsl:text>}</xsl:text>
    <xsl:if test="following-sibling::*">
        <xsl:text>,</xsl:text>
    </xsl:if>
</xsl:template>

<xsl:template match="s:Envelope">
    <xsl:text>[</xsl:text>
        <xsl:apply-templates select="@*|node()" />
    <xsl:text>]</xsl:text>
</xsl:template>

</xsl:stylesheet>

{
"
":"
",
"
":"
"
,
}
,
[
]
我想用一个模板替换第二个模板,如下所示,但我无法使其匹配:

非功能XSLT

<?xml version="1.0"?>
<xsl:stylesheet xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://tempuri.org/" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:a="http://schemas.datacontract.org/2004/07/Flairdocs.Framework.DocumentManagement" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:b="http://schemas.datacontract.org/2004/07/Flairdocs.Data.Models.Contracts.Data" version="1.0">
<xsl:output method="text"/>

<xsl:template match="s:Header">
</xsl:template>

<xsl:template match="a:StoredDocumentEntity">
    <xsl:text>{</xsl:text>
        <xsl:for-each select="*[not(self::a:SummaryMetadata)]">
            <xsl:text>"</xsl:text>
            <xsl:value-of select="local-name()"/>
            <xsl:text>":"</xsl:text>
            <xsl:value-of select="normalize-space(.)"/>
            <xsl:text>",</xsl:text>
        </xsl:for-each>
        <xsl:for-each select="a:SummaryMetadata/a:DocumentMetaDataEntry">
            <xsl:text>"</xsl:text>
            <xsl:value-of select="a:SystemName"/>
            <xsl:text>":"</xsl:text>
            <xsl:value-of select="a:Value"/>
            <xsl:text>"</xsl:text>
            <xsl:if test="following-sibling::*">
                <xsl:text>,</xsl:text>
            </xsl:if>
        </xsl:for-each>         
    <xsl:text>}</xsl:text>
    <xsl:if test="following-sibling::*">
        <xsl:text>,</xsl:text>
    </xsl:if>
</xsl:template>

<xsl:template match="s:Envelope">
    <xsl:text>[</xsl:text>
        <xsl:apply-templates select="@*|node()" />
    <xsl:text>]</xsl:text>
</xsl:template> 
</xsl:stylesheet>
<?xml version="1.0"?>
<xsl:stylesheet xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://tempuri.org/" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:a="http://schemas.datacontract.org/2004/07/Flairdocs.Framework.DocumentManagement" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:b="http://schemas.datacontract.org/2004/07/Flairdocs.Data.Models.Contracts.Data" version="1.0">
<xsl:output method="text"/>

<xsl:template match="s:Header">
</xsl:template>

<xsl:template match="a:DocumentMetaDataEntry">
    <xsl:text>"</xsl:text>
    <xsl:value-of select="a:SystemName"/>
    <xsl:text>":"</xsl:text>
    <xsl:value-of select="a:Value"/>
    <xsl:text>"</xsl:text>
    <xsl:if test="following-sibling::*">
        <xsl:text>,</xsl:text>
    </xsl:if>
</xsl:template>

<xsl:template match="a:StoredDocumentEntity">
    <xsl:text>{</xsl:text>
        <xsl:for-each select="*[not(self::a:SummaryMetadata)]">
            <xsl:text>"</xsl:text>
            <xsl:value-of select="local-name()"/>
            <xsl:text>":"</xsl:text>
            <xsl:value-of select="normalize-space(.)"/>
            <xsl:text>",</xsl:text>
        </xsl:for-each>
        <xsl:apply-templates select="./a:DocumentMetaDataEntry" />
    <xsl:text>}</xsl:text>
    <xsl:if test="following-sibling::*">
        <xsl:text>,</xsl:text>
    </xsl:if>
</xsl:template>

<xsl:template match="s:Envelope">
    <xsl:text>[</xsl:text>
        <xsl:apply-templates select="@*|node()" />
    <xsl:text>]</xsl:text>
</xsl:template>

</xsl:stylesheet>

"
":"
"
,
{
"
":"
",
}
,
[
]
我知道这真的很简单,但我在这里和其他地方花了很多时间,我就是不知道模板是如何工作的。 标签的正确选择属性是什么?


如果我也可以为每个替换第一个,那么就有了令人敬畏的奖励。

如果for-each循环有效,您应该能够在不更改表达式的情况下将其替换为apply-templates

<xsl:apply-templates select="a:SummaryMetadata/a:DocumentMetaDataEntry" />

当前表达式不起作用的原因是,它正在查找名为DocumentMetaDataEntry的子元素,而没有子元素,因为该子元素位于下一级。你的表情应该是这样的

<xsl:apply-templates select=".//a:DocumentMetaDataEntry" />

两条斜线告诉它在任何级别搜索后代,而不仅仅是直接子代

要替换第一个xsl:for-each,只需将其替换为xsl:apply模板,如下所示

<xsl:apply-templates select="*[not(self::a:SummaryMetadata)]" />

然后,创建一个模板来匹配StoredDocumentEntity的子级,如下所示

<xsl:template match="a:StoredDocumentEntity/*">

虽然理论上这将匹配SummaryMetadata元素,但实际上您没有任何选择它们的应用模板