xslt 1.0を使用してSharepoint 2013のデータビューを変換しています。 データソースが3で構成され、リストに参加:select(Sharepoint 2013)で動的に作成されたxsl:variableを使用します。
- ISOList
- Threat_Catalogue(ISOListにルックアップ(複数)を有する)
- リスク(Threat_Catalogueにルックアップ(単一)を有する)
私はISOListのアイテムをループしており、この特定のアイテムに関連するすべてのリスクを表示したいと考えています。論理:最初にISOListの特定のアイテムに関連する脅威を見つけ、その脅威の1つに関連するリスクを見つけます。
だから私は、パラメータとしてISOListからアイテムID(ISORef)でテンプレートを呼んでいる - そうのように:問題は基準として使用する場合、変数ListThreatsが空の文字列として表示されていることである
<xsl:template name="Risks">
<xsl:param name="ISORef" />
<!-- add extra info to string, so it only selects relevant items -->
<xsl:variable name="ISORefString" select="concat('&ID=',$ISORef,'&RootFolder')"/>
<!-- get relevant threats -->
<xsl:variable name="SelectedThreats" select="/dsQueryResponse/Threat_Catalogue/Rows/Row[contains(@ISO_x0020_Reference, $ISORefString)]"/>
<!-- Create variable, that contains all ID's in Threat_Catalogue that are relevant -->
<xsl:variable name="ListThreats"><xsl:for-each select="$SelectedThreats">=<xsl:value-of select="@ID"/>&</xsl:for-each></xsl:variable>
<!-- Variable - just to illustrate problem -->
<xsl:variable name="ListThreatsAlternative" select="$ListThreats" />
<!-- this is where I'm trying to use variable to get relevant risks, but fails -->
<!-- Old: Didn't Work, has been replaced -->
<!--
<xsl:variable name="SelectedRisks" select="/dsQueryResponse/Risks/Rows/Row[contains($ListThreats, substring-before(substring-after(@Threat, 'ID'), 'RootFolder'))]"/>
-->
<!-- New: Works as intended -->
<xsl:variable name="SelectedRisks" select="/dsQueryResponse/Risks/Rows/Row[contains($ListThreats, substring-before(substring-after(@Threat, 'ID'), 'RootFolder')) and $ListThreats != '' and @Threat != '']"/>
<!-- Example output: -->
Original: <xsl:value-of select="$ListThreats" /> <!-- contains: '=118&' --> <br/>
Alternative: <xsl:value-of select="$ListThreatsAlternative" /> <!-- empty -->
</xsl:template>
SelectedRisksまたはListThreatsAlternativeのいずれかを選択します。
*編集:
ソースXMLはSharepointによって生成されます。特定のデータソースのXMLを取得する方法はわかりませんが、その下にある[リスク]リストからXMLを追加しました。私はXMLソースを大幅に短縮しましたが、うまくいけば十分です。 また、ソースXMLにいくつかの重要な違いがあり、Sharepointがリストに提示するものがあります。特に、ルックアップフィールドについて言えば。
例:
SharePointは、コンテンツを提示すると: https://xxx.xxx.xxx.com/sites/xxx_xxx/ISMS/_layouts/15/listform.aspx?PageType=4 & ListId = {4ab4bbff-588b-4c06-9685-c814cdefd59f} & ID = 56 & RootFolder = * '、RefreshPage); false false; "href =" https://xxx.xxx.xxx.com/sites/xxx_xxx/ISMS/_layouts/15/listform.aspx?PageType=4 & ListId = {4ab4bbff-588b-4c06-9685-c814cdefd59f} & ID = 56 & RootFolder = * ">ハッカー:同様のコンテンツは、ソースXMLに示され
クラック14パスワード:
55; #Hackers:13マルウェア
これはありますXMLソース(短縮):
<xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">
<s:Schema id="RowsetSchema">
<s:ElementType name="row" content="eltOnly" rs:CommandTimeout="30">
<s:AttributeType name="ows_ID" rs:name="ID" rs:number="1">
<s:datatype dt:type="i4" dt:maxLength="4"/>
</s:AttributeType>
<s:AttributeType name="ows_LinkTitle" rs:name="Risk Title" rs:number="2">
<s:datatype dt:type="string" dt:maxLength="512"/>
</s:AttributeType>
<s:AttributeType name="ows_Threat" rs:name="Threat" rs:number="15">
<s:datatype dt:type="variant" dt:lookup="true" dt:maxLength="8009"/>
</s:AttributeType>
</s:ElementType>
</s:Schema>
<rs:data>
<z:row ows_ID="72" ows_LinkTitle="Test risk" ows_Threat="55;#Hackers: 13. Malware" />
</rs:data>
</xml>
ソースXMLを見ることなく、これをデバッグすることは不可能です。あなたのコードには明らかに間違ったことはありませんが、あなたのデータとどこかで一致しているとは限りません。私たちが知っている限り、データは名前空間にあり、あなたのパス式のどれもが何も一致しないことを意味します。 –
XMLソースで質問を更新しました。私も可能です。 – Snib
入力したXMLのどれもがテンプレートと一致しないため、誰もあなたを助けることができません。 dsQueryResponse/Threat_Catalogue、dsQueryResponse/Risks、Risksを含むxmlツリーでサンプル入力を表示する必要があります。入力にアクセスできない場合は、xmlのフラグメントを入力から出力にコピーするために "xsl:copy-of select"文を挿入することを検討してください。 –