0
votes

I'm using xslt 1.0 to transform a Sharepoint 2013 Data View. The data source consists of 3 joined lists:

  • ISOList
  • Threat_Catalogue (has a lookup (multiple) to ISOList)
  • Risks (has a lookup (single) to Threat_Catalogue)

I'm looping thru items in ISOList, and want to show all Risks that are relevant for this specific item. The logic being: First find Threats related to the specific item in ISOList, and then find Risks related to one of those Threats.

So I'm calling a template with the item ID (ISORef) from ISOList as a parameter - like so:

<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('&amp;ID=',$ISORef,'&amp;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"/>&amp;</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>

The problem is that variable ListThreats appears as an empty string when used as a criteria in the select for either SelectedRisks or ListThreatsAlternative.

*Edited:

The source XML is generated by Sharepoint. I don't know how to get the XML of the specific data source, but below I've added the XML from the Risks list. I've shortened down the XML source substantially, but hopefully it is sufficient. Also - there are some significant differences in source XML and what Sharepoint presents in a list. Especially when it comes to the lookup-fields.

Example:

When Sharepoint presents the content: 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); return 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=*">Hackers: 14. Password Cracking

When similar content is shown in source XML:

55;#Hackers: 13. Malware

This is the XML source (shortened):

<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>
1
Without seeing the source XML it is impossible to debug this. There is nothing obviously wrong with your code, but it presumably doesn't match your data somewhere. For all we know, the data is in a namespace which would mean none of your path expressions match anything. - Michael Kay
Updated question with XML source - as well as I could - Snib
Nobody will be able to help you because the none of the input xml you've given us matchs the template. You need to show us sample input with xml tree containing dsQueryResponse/Threat_Catalogue, dsQueryResponse/Risks, Risks. If you have no access to the inputs, then consider inserting a "xsl:copy-of select" statement to copy fragment of xml from the input into the output. - Phil Blackburn

1 Answers

0
votes

Found the answer, stupid mistake in the select. Edited in OP.