{"record":{"id":"a9b8ce27024eae02","repo":"facebook/docusaurus","slug":"blog-feed-xslt-file-not-found-at-path-path-relat","errorCode":null,"errorMessage":"Blog feed XSLT file not found at path=${path.relative(process.cwd(), xsltAbsolutePath)}","messagePattern":"Blog feed XSLT file not found at path=(.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/docusaurus-plugin-content-blog/src/feed.ts","lineNumber":203,"sourceCode":"      return feedItem;\n    }),\n  );\n}\n\nasync function resolveXsltFilePaths({\n  xsltFilePath,\n  contentPaths,\n}: {\n  xsltFilePath: string;\n  contentPaths: BlogContentPaths;\n}) {\n  const xsltAbsolutePath: string = path.isAbsolute(xsltFilePath)\n    ? xsltFilePath\n    : ((await getDataFilePath({filePath: xsltFilePath, contentPaths})) ??\n      path.resolve(contentPaths.contentPath, xsltFilePath));\n\n  if (!(await fs.pathExists(xsltAbsolutePath))) {\n    throw new Error(\n      logger.interpolate`Blog feed XSLT file not found at path=${path.relative(\n        process.cwd(),\n        xsltAbsolutePath,\n      )}`,\n    );\n  }\n\n  const parsedPath = path.parse(xsltAbsolutePath);\n  const cssAbsolutePath = path.resolve(\n    parsedPath.dir,\n    `${parsedPath.name}.css`,\n  );\n  if (!(await fs.pathExists(cssAbsolutePath))) {\n    throw new Error(\n      logger.interpolate`Blog feed XSLT file was found at path=${path.relative(\n        process.cwd(),\n        xsltAbsolutePath,\n      )}","sourceCodeStart":185,"sourceCodeEnd":221,"githubUrl":"https://github.com/facebook/docusaurus/blob/3f483e80e326cc646b54b83d564b3f0c4881b9a6/packages/docusaurus-plugin-content-blog/src/feed.ts#L185-L221","documentation":"Thrown by getXsltFile when the XSLT file referenced by the feed options (feedOptions.xslt) does not exist on disk at the resolved absolute path. The path can be absolute or relative to the content path / data file path; the message prints it relative to process.cwd() for readability.","triggerScenarios":"Setting the blog feed `xslt` option to a path that does not resolve to an existing file. Triggered during feed generation in generateXsltFiles when fs.pathExists returns false.","commonSituations":"Typo in the xslt filename, file committed with wrong casing, file not committed to the repo, or a path assumed relative to project root when it is resolved against the content directory.","solutions":["Verify the file exists at the resolved path shown in the message.","Use an absolute path or place the file inside the blog content directory.","Check git tracking and casing of the filename on case-sensitive filesystems."],"exampleFix":"// before\nblog: { feed: { xslt: 'rss.xslt' } }\n// after — file lives in blog/\nblog: { feed: { xslt: 'blog/rss.xslt' } }","handlingStrategy":"validation","validationCode":"import fs from 'fs-extra';\nimport path from 'path';\nconst abs = path.isAbsolute(xslt) ? xslt : path.resolve(contentPath, xslt);\nif (!(await fs.pathExists(abs))) throw new Error(`XSLT not found: ${abs}`);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Commit the xslt file alongside config and verify casing.","Prefer paths relative to the blog content directory."],"tags":["blog","feed","xslt","filesystem"],"backgroundTag":null,"analyzedSha":"3f483e80e326cc646b54b83d564b3f0c4881b9a6","analyzedAt":"2026-08-12T13:25:04.382Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}