xslt を使用して、json への SOAP 応答をレンダリングしています。私は石鹸サービスを制御できません。
を使用<xsl:apply-templates>
していくつかの要素を処理できますが、テンプレートの 1 つを機能させることができません。を使用して動作してい<xsl:for-each>
ます。
ソース 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>
次のように、各ドキュメントの主な属性を取り出して、<a:DocumentMetaDataEntry>
要素を「フラット化」する必要があります。
望ましい出力
[{
"CreatedBy":"Data Migration Tool",
"CreatedDate":"2014-01-16T00:00:00",
"Description":"",
"DocumentType":"File SummaryCard (136)",
"DocumentTypeSystemName":"136_File Summary Card",
"EntityAssociations":"",
"GenerationTemplateSystemName":"",
"IsLink":"false",
"LinkText":"",
"ModifiedBy":"",
"ModifiedDate":"2014-01-16T00:00:00",
"Title":"H0782-10014 - File Summary Card",
"VersionCount":"1",
"FileNumber":"H0782-10014",
"RWProcess":"File Administration",
"RWProjectNumber":"H0782"
},{
"CreatedBy":"Data Migration Tool",
"CreatedDate":"2014-01-16T00:00:00",
"Description":"",
"DocumentType":"File SummaryCard (136)",
"DocumentTypeSystemName":"136_File Summary Card",
"EntityAssociations":"",
"GenerationTemplateSystemName":"",
"IsLink":"false",
"LinkText":"",
"ModifiedBy":"",
"ModifiedDate":"2014-01-16T00:00:00",
"Title":"H0782-10014 - File Summary Card",
"VersionCount":"1",
"FileNumber":"H0782-10014",
"RWProcess":"File Administration",
"RWProjectNumber":"H0782"
}]
次の XSLT は私が望むものを与えてくれますが、単純化して 2 番目<xsl:for-each>
(可能であれば最初のものも!)を削除したいと思います。
作業中の 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>
2 番目の for-each を次のようなテンプレートに置き換えたいのですが、一致させることができません。
機能しない 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: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>
これが非常に単純であることはわかっていますが、ここや他の場所でかなりの時間を費やしてきたので、テンプレートがどのように機能するかについて頭を悩ませることはできません。
タグの適切な選択属性は何ですか?<xsl:apply-templates>
最初の for-each も置き換えることができれば、素晴らしいボーナスのエーテル象...